Die vorherigen Antworten sind hilfreich, aber waren nicht genug für mich. Schließlich fand ich einen tollen Artikel von 2012 in Microsofts .Net 4.5 Entwicklerhandbuch: Binding a custom activity property to a designer control. Dieser Artikel war fast die vollständige Antwort - abgesehen von einem kleineren Fehler in der benutzerdefinierten Konverterklasse und einem großen Fehler: Diese Technik speichert einen Wert aus der ComboBox, aber er wird ihn nicht wiederherstellen, wenn Sie Ihren Workflow erneut öffnen.
Microsoft Ron Jacobs has another answer für benutzerdefinierte Aktivitäten Designer. Ich habe die beiden kombiniert, um eine funktionierende Lösung zu bekommen.
Custom-Designer
Die ModelToObjectValueConverter
war eine unglaublich hilfreiche Ressource, so dass ich meine eigenen IValueConverter
überspringen zu schaffen. Im ObjectDataProvider
sehen Sie, dass ich eine Liste von Strings durch Aufruf einer statischen Methode, People.GetPeople()
, lade. Die ComboBox bindet an diesen Anbieter als Nachrichtenquelle, sondern bindet den ausgewählten Wert an der Person Eigenschaft auf der benutzerdefinierte Aktivität (unten)
<sap:ActivityDesigner x:Class="ActivityLibrary1.ComboBoxActivityDesigner"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sap="clr-namespace:System.Activities.Presentation;assembly=System.Activities.Presentation"
xmlns:sapc="clr-namespace:System.Activities.Presentation.Converters;assembly=System.Activities.Presentation"
xmlns:sapv="clr-namespace:System.Activities.Presentation.View;assembly=System.Activities.Presentation"
xmlns:c="clr-namespace:ActivityLibrary1">
<sap:ActivityDesigner.Resources>
<ResourceDictionary>
<sapc:ModelToObjectValueConverter x:Key="ModelToObjectValueConverter" />
<ObjectDataProvider x:Key="people" ObjectType="{x:Type c:People}" MethodName="GetPeople"/>
</ResourceDictionary>
</sap:ActivityDesigner.Resources>
<Grid>
<Label Content="Person" HorizontalAlignment="Left" VerticalAlignment="Top" />
<ComboBox HorizontalAlignment="Left"
Margin="66,0,0,0"
VerticalAlignment="Top"
Width="120"
SelectedValue="{Binding Path=ModelItem.Person, Mode=TwoWay, Converter={StaticResource ModelToObjectValueConverter} }"
ItemsSource="{Binding Source={StaticResource people}}">
</ComboBox>
</Grid>
</sap:ActivityDesigner>
Custom Code Aktivität
Beachten Sie, dass dies eine Eigenschaft verwendet, eher als ein InArgument, das das Kombinieren der ComboBox erleichtert.
[Designer(typeof(ComboBoxActivityDesigner))]
public class CodeActivity1 : CodeActivity
{
public string Person { get; set; }
protected override void Execute(CodeActivityContext context)
{
// Just to demonstrate that it worked
MessageBox.Show(Person);
}
}
Workflow-
Nun ist die benutzerdefinierte Aktivität, CodeActivity1
, kann auf einen Workflow gezogen werden. Wenn Sie eine Auswahl treffen, wird der ausgewählte Wert im Eigenschaftenbereich angezeigt. Speichern Sie den Workflow. Schließen und erneut öffnen. Der zuvor ausgewählte Wert bleibt wie gewünscht erhalten.
Wollen Sie wirklich Ihre benutzerdefinierte Aktivität eine InArgument eher als eine Eigenschaft haben? (public InArgument Arg {get; set;} vs. öffentliche Zeichenkette Arg {get; set;}) –
@Tim, ich denke nur eine Standard-Eigenschaft wäre auch in Ordnung. –