Vazba vlastní vlastnosti aktivity s ovládacím prvkem návrháře
Vytvoření vazby ovládacího prvku návrháře textového pole s argumentem aktivity je poměrně jednoduché; vytvoření vazby komplexního ovládacího prvku návrháře (například pole se seznamem) na argument aktivity však může představovat problémy. Toto téma popisuje, jak vytvořit vazbu argumentu aktivity na ovládací prvek pole se seznamem u vlastního návrháře aktivit.
Vytvoření převaděče položek pole se seznamem
Vytvořte nové prázdné řešení v sadě Visual Studio s názvem CustomProperty.
Vytvořte novou třídu s názvem ComboBoxItemConverter. Přidejte odkaz na System.Windows.Data a mají třídu odvozenou z IValueConverter. Mít Visual Studio implementovat rozhraní pro generování zástupné procedury pro
Convert
aConvertBack
.Do metody
Convert
přidejte následující kód. Tento kód převede typ String aktivity InArgument<T> na hodnotu, která se má umístit do návrháře.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;
Výraz ve výše uvedeném fragmentu kódu lze vytvořit také pomocí .CSharpValue<TResult>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;
Do metody
ConvertBack
přidejte následující kód. Tento kód převede příchozí položku pole se seznamem zpět na položku InArgument<T>.// 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;
Výraz ve výše uvedeném fragmentu kódu lze vytvořit také pomocí .CSharpValue<TResult>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;
Přidání comboBoxItemConverter do vlastního návrháře aktivity
Přidejte do projektu novou položku. V dialogovém okně Nová položka vyberte uzel Pracovní postup a jako typ nové položky vyberte Návrhář aktivity. Pojmenujte položku CustomPropertyDesigner.
Přidejte pole se seznamem do nového návrháře. Ve vlastnosti Items přidejte do pole se seznamem několik položek s hodnotami Obsahu položky1 a Item2.
Upravte XAML pole se seznamem tak, aby se nový převaděč položek přidal jako převaděč položek, který se má použít pro pole se seznamem. Převaděč je přidán jako prostředek v ActivityDesigner.Resources segment, a určuje převaděč v Converter atributu ComboBox. Všimněte si, že obor názvů projektu je určen v atributech oborů názvů pro návrháře aktivit; Pokud se má návrhář použít v jiném projektu, bude nutné tento obor názvů změnit.
<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>
Vytvořte novou položku typu CodeActivity. V tomto příkladu bude stačit výchozí kód vytvořený integrovaným vývojovém prostředím pro aktivitu.
Do definice třídy přidejte následující atribut:
[Designer(typeof(CustomPropertyDesigner))]
Tento řádek přidruží nového návrháře k nové třídě.
Nová aktivita by teď měla být přidružená k návrháři. Pokud chcete novou aktivitu otestovat, přidejte ji do pracovního postupu a nastavte pole se seznamem na dvě hodnoty. Okno vlastností by se mělo aktualizovat tak, aby odráželo hodnotu pole se seznamem.