Binda en anpassad aktivitetsegenskap till en designerkontroll
Det är ganska enkelt att binda en textrutedesignerkontroll till ett aktivitetsargument. Att binda en komplex designerkontroll (till exempel en kombinationsruta) till ett aktivitetsargument kan dock innebära utmaningar. I det här avsnittet beskrivs hur du binder ett aktivitetsargument till en kombinationsrutekontroll i en anpassad aktivitetsdesigner.
Skapa kombinationsrutans objektkonverterare
Skapa en ny tom lösning i Visual Studio med namnet CustomProperty.
Skapa en ny klass med namnet ComboBoxItemConverter. Lägg till en referens till System.Windows.Data och låt klassen härledas från IValueConverter. Låt Visual Studio implementera gränssnittet för att generera stubs för
Convert
ochConvertBack
.Lägg till följande kod i metoden
Convert
. Den här koden konverterar aktivitetens InArgument<T> typ String till det värde som ska placeras i designern.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;
Uttrycket i kodfragmentet ovan kan också skapas med i CSharpValue<TResult> stället för 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;
Lägg till följande kod i metoden
ConvertBack
. Den här koden konverterar det inkommande kombinationsruteobjektet tillbaka till en 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;
Uttrycket i kodfragmentet ovan kan också skapas med i CSharpValue<TResult> stället för 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;
Lägga till ComboBoxItemConverter i den anpassade designern för en aktivitet
Lägg till ett nytt objekt i projektet. I dialogrutan Nytt objekt väljer du noden Arbetsflöde och väljer Aktivitetsdesigner som typ av det nya objektet. Ge objektet namnet CustomPropertyDesigner.
Lägg till en kombinationsruta i den nya designern. I egenskapen Objekt lägger du till ett par objekt i kombinationsrutan med innehållsvärdena "Item1" och "Item2".
Ändra XAML för kombinationsrutan för att lägga till den nya objektkonverteraren som objektkonverterare som ska användas för kombinationsrutan. Konverteraren läggs till som en resurs i segmentet ActivityDesigner.Resources och anger konverteraren i konverterarattributet ComboBoxför . Observera att projektets namnområde anges i namnrymdsattributen för aktivitetsdesignern. Om designern ska användas i ett annat projekt måste namnområdet ändras.
<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>
Skapa ett nytt objekt av typen CodeActivity. Standardkoden som skapas av IDE för aktiviteten räcker för det här exemplet.
Lägg till följande attribut i klassdefinitionen:
[Designer(typeof(CustomPropertyDesigner))]
Den här raden associerar den nya designern med den nya klassen.
Den nya aktiviteten bör nu associeras med designern. Om du vill testa den nya aktiviteten lägger du till den i ett arbetsflöde och anger kombinationsrutan till de två värdena. Egenskapsfönstret bör uppdateras för att återspegla kombinationsrutans värde.