Een aangepaste activiteitseigenschap koppelen aan een ontwerpfunctiebesturingselement
Het koppelen van een besturingselement voor een tekstvakontwerper aan een activiteitargument is vrij eenvoudig; het koppelen van een complex ontwerper besturingselement (zoals een keuzelijst met invoervak) aan een activiteitargument kan echter uitdagingen opleveren. In dit onderwerp wordt beschreven hoe u een activiteitsargument koppelt aan een besturingselement met invoervak in een aangepaste activiteitsontwerper.
Het conversieprogramma voor keuzelijsten met invoervak maken
Maak een nieuwe lege oplossing in Visual Studio met de naam CustomProperty.
Maak een nieuwe klasse met de naam ComboBoxItemConverter. Voeg een verwijzing naar System.Windows.Data toe en laat de klasse afleiden van IValueConverter. Visual Studio de interface laten implementeren voor het genereren van stubs voor
Convert
enConvertBack
.Voeg de volgende code toe aan de methode
Convert
. Met deze code wordt het type String van de activiteit InArgument<T> geconverteerd naar de waarde die in de ontwerpfunctie moet worden geplaatst.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;
De expressie in het bovenstaande codefragment kan ook worden gemaakt in CSharpValue<TResult> plaats van 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;
Voeg de volgende code toe aan de methode
ConvertBack
. Met deze code wordt het item van de binnenkomende keuzelijst met invoervak weer geconverteerd naar een 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;
De expressie in het bovenstaande codefragment kan ook worden gemaakt in CSharpValue<TResult> plaats van 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;
De ComboBoxItem Converter toevoegen aan de aangepaste ontwerper van een activiteit
Voeg een nieuw item toe aan het project. Selecteer in het dialoogvenster Nieuw item het werkstroomknooppunt en selecteer Activiteitontwerper als het type van het nieuwe item. Geef het item de naam CustomPropertyDesigner.
Voeg een keuzelijst met invoervak toe aan de nieuwe ontwerpfunctie. Voeg in de eigenschap Items een aantal items toe aan de keuzelijst met invoervak, met inhoudswaarden 'Item1' en 'Item2'.
Wijzig de XAML van de keuzelijst met invoervak om het nieuwe itemconversieprogramma toe te voegen als het itemconversieprogramma dat moet worden gebruikt voor de keuzelijst met invoervak. Het conversieprogramma wordt toegevoegd als een resource in het segment ActivityDesigner.Resources en geeft het conversieprogramma op in het kenmerk Conversieprogramma voor de ComboBox. Houd er rekening mee dat de naamruimte van het project is opgegeven in de naamruimtenkenmerken voor de activiteitontwerper; als de ontwerpfunctie moet worden gebruikt in een ander project, moet deze naamruimte worden gewijzigd.
<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>
Maak een nieuw item van het type CodeActivity. De standaardcode die door de IDE voor de activiteit is gemaakt, is voldoende voor dit voorbeeld.
Voeg het volgende kenmerk toe aan de klassedefinitie:
[Designer(typeof(CustomPropertyDesigner))]
Deze lijn koppelt de nieuwe ontwerper aan de nieuwe klasse.
De nieuwe activiteit moet nu worden gekoppeld aan de ontwerper. Als u de nieuwe activiteit wilt testen, voegt u deze toe aan een werkstroom en stelt u de keuzelijst met invoervak in op de twee waarden. Het eigenschappenvenster moet worden bijgewerkt om de waarde van de keuzelijst met invoervak weer te geven.