Wiązanie niestandardowych właściwości działań z kontrolką projektanta
Powiązanie kontrolki projektanta pól tekstowych z argumentem działania jest dość proste; powiązanie złożonej kontrolki projektanta (na przykład pola kombi) z argumentem działania może jednak stanowić wyzwanie. W tym temacie omówiono sposób powiązania argumentu działania z kontrolką pola kombi w niestandardowym projektancie działań.
Tworzenie konwertera elementów pola kombi
Utwórz nowe puste rozwiązanie w programie Visual Studio o nazwie CustomProperty.
Utwórz nową klasę o nazwie ComboBoxItemConverter. Dodaj odwołanie do elementu System.Windows.Data i utwórz klasę pochodzącą z klasy IValueConverter. Zaimplementuj interfejs w programie Visual Studio, aby wygenerować wycinki dla elementów
Convert
iConvertBack
.Dodaj następujący kod do metody
Convert
: Ten kod konwertuje typ String działania InArgument<T> na wartość, która ma zostać umieszczona w projektancie.ModelItem modelItem = value as ModelItem; if (value != null) { InArgument<string> inArgument = modelItem.GetCurrentValue() as InArgument<string>; if (inArgument != null) { Activity<string> expression = inArgument.Expression; VisualBasicValue<string> vbexpression = expression as VisualBasicValue<string>; Literal<string> literal = expression as Literal<string>; if (literal != null) { return "\"" + literal.Value + "\""; } else if (vbexpression != null) { return vbexpression.ExpressionText; } } } return null;
Wyrażenie w powyższym fragmencie kodu można również utworzyć przy użyciu polecenia CSharpValue<TResult> zamiast VisualBasicValue<TResult>.
ModelItem modelItem = value as ModelItem; if (value != null) { InArgument<string> inArgument = modelItem.GetCurrentValue() as InArgument<string>; if (inArgument != null) { Activity<string> expression = inArgument.Expression; CSharpValue<string> csexpression = expression as CSharpValue<string>; Literal<string> literal = expression as Literal<string>; if (literal != null) { return "\"" + literal.Value + "\""; } else if (csexpression != null) { return csexpression.ExpressionText; } } } return null;
Dodaj następujący kod do metody
ConvertBack
: Ten kod konwertuje przychodzący element pola kombi z powrotem na InArgument<T>element .// Convert combo box value to InArgument<string> string itemContent = (string)((ComboBoxItem)value).Content; VisualBasicValue<string> vbArgument = new VisualBasicValue<string>(itemContent); InArgument<string> inArgument = new InArgument<string>(vbArgument); return inArgument;
Wyrażenie w powyższym fragmencie kodu można również utworzyć przy użyciu polecenia CSharpValue<TResult> zamiast VisualBasicValue<TResult>.
// Convert combo box value to InArgument<string> string itemContent = (string)((ComboBoxItem)value).Content; CSharpValue<string> csArgument = new CSharpValue<string>(itemContent); InArgument<string> inArgument = new InArgument<string>(csArgument); return inArgument;
Dodawanie elementu ComboBoxItemConverter do niestandardowego projektanta działania
Dodaj nowy element do projektu. W oknie dialogowym Nowy element wybierz węzeł Przepływ pracy i wybierz pozycję Działanie Projektant jako typ nowego elementu. Nadaj elementowi nazwę CustomProperty Projektant.
Dodaj pole kombi do nowego projektanta. We właściwości Items dodaj kilka elementów do pola kombi z wartościami Zawartości "Item1" i "Item2".
Zmodyfikuj kod XAML pola kombi, aby dodać nowy konwerter elementów jako konwerter elementów, który ma być używany dla pola kombi. Konwerter jest dodawany jako zasób w działaniu Projektant. Segment zasobów i określa konwerter w atrybucie Konwerter dla elementu ComboBox. Należy pamiętać, że przestrzeń nazw projektu jest określona w atrybutach przestrzeni nazw dla projektanta działań; Jeśli projektant ma być używany w innym projekcie, ta przestrzeń nazw musi zostać zmieniona.
<sap:ActivityDesigner x:Class="CustomProperty.CustomPropertyDesigner" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c="clr-namespace:CustomProperty" xmlns:sap="clr-namespace:System.Activities.Presentation;assembly=System.Activities.Presentation" xmlns:sapv="clr-namespace:System.Activities.Presentation.View;assembly=System.Activities.Presentation"> <sap:ActivityDesigner.Resources> <ResourceDictionary> <c:ComboBoxItemConverter x:Key="comboBoxItemConverter"/> </ResourceDictionary> </sap:ActivityDesigner.Resources> <Grid> <ComboBox SelectedValue="{Binding Path=ModelItem.Text, Mode=TwoWay, Converter={StaticResource comboBoxItemConverter}}" Height="23" HorizontalAlignment="Left" Margin="132,5,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" ItemsSource="{Binding}"> <ComboBoxItem>item1</ComboBoxItem> <ComboBoxItem>item2</ComboBoxItem> </ComboBox> </Grid> </sap:ActivityDesigner>
Utwórz nowy element typu CodeActivity. Domyślny kod utworzony przez środowisko IDE dla działania będzie wystarczający dla tego przykładu.
Dodaj następujący atrybut do definicji klasy:
[Designer(typeof(CustomPropertyDesigner))]
Ten wiersz kojarzy nowy projektant z nową klasą.
Nowe działanie powinno być teraz skojarzone z projektantem. Aby przetestować nowe działanie, dodaj je do przepływu pracy i ustaw pole kombi na dwie wartości. Okno właściwości powinno zostać zaktualizowane, aby odzwierciedlić wartość pola kombi.