Ich habe eine benutzerdefinierte Aktivität mit einem einzelnen Argument, das eine Zeichenfolge ist. Anstatt dem Designer jedoch die Eingabe einer beliebigen Zeichenfolge zu erlauben, möchte ich, dass dem Designer eine Combobox mit der Optionsliste angezeigt wird. Die Optionen sind dynamisch und werden aus einer Datenbank in eine List & lt; & gt; Sammlung.
Mein Problem ist, dass ich keine Ahnung habe, wie man die Combobox im Designer an diese Liste bindet und die Auswahl auf das in-Argument der Aktivität setzt. Visuell habe ich den Aktivitätsdesigner am arbeiten, es ist nur dieser eine Schritt.
Normalerweise würde ich die Aktivität mit einem property
anstatt mit einem InArgument
schreiben. Dies vereinfacht das Szenario:
(hier ist ValidOptions eine Collection-Eigenschaft in Ihrer ActivityDesigner-Klasse. MyStringProperty ist eine öffentliche get / set / -Eigenschaft für die zugrunde liegende Aktivität wie:
%Vor%)
Das Problem, das Sie haben werden, wenn Sie InArgument
zum Mix hinzufügen, ist, dass die Zeichenfolgenwerte aus dem Kombinationsfeld nicht direkt einer ModelItem
expecting InArgument<string>
zugewiesen werden können. Dies ist mit einem benutzerdefinierten IValueConverter
in Ihrer Bindung reparierbar.
Die vorherigen Antworten sind hilfreich, aber waren nicht genug für mich. Irgendwann habe ich einen grandiosen Artikel von 2012 in Microsofts .Net 4.5 Developer Guide gefunden: Eine benutzerdefinierte Aktivitätseigenschaft an ein Designer-Steuerelement binden . 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's Ron Jacobs hat eine andere Antwort für benutzerdefinierte Aktivitätsdesigner. Ich habe die beiden kombiniert, um eine funktionierende Lösung zu finden.
Benutzerdefinierter Designer
Die ModelToObjectValueConverter
war eine unglaublich hilfreiche Ressource, die es mir ermöglichte, meine eigene IValueConverter
zu erstellen. In ObjectDataProvider
sehen Sie, wie ich eine Liste von Strings durch Aufruf einer statischen Methode, People.GetPeople()
, lade. Die ComboBox bindet an diesen Provider als die Elementquelle, aber bindet den ausgewählten Wert an die Person-Eigenschaft in der benutzerdefinierten Aktivität (unten)
Benutzerdefinierte Codeaktivität
Beachten Sie, dass hier eine Eigenschaft und kein InArgument verwendet wird, was die Bindung an die ComboBox erleichtert.
%Vor%Workflow
Jetzt kann die benutzerdefinierte Aktivität CodeActivity1
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.
Eine Möglichkeit, dies zu lösen, besteht darin, einen eigenen ComboBoxEditor zu definieren, der von UITypeEditor abgeleitet ist. Zeigen Sie die Sammlung, die Sie binden möchten, der Combobox in der Aktivitätsklasse an und dekorieren Sie Ihre bindbare Eigenschaft in der Aktivitätsklasse mit folgendem Attribut:
%Vor%Auch im benutzerdefinierten comboboxEditor müssen Sie Ihre Änderungen vornehmen EditValue (ITypeDescriptorContext-Kontext, IServiceProvider-Provider, Objektwert) -Methode, um die Auflistung abzurufen und an die Combobox zu binden.
Tags und Links workflow-foundation workflow workflow-foundation-4