Daten an Combobox im benutzerdefinierten Aktivitätsdesigner binden

9

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.

    
Chris Taylor 27.04.2010, 19:27
quelle

3 Antworten

7

Normalerweise würde ich die Aktivität mit einem property anstatt mit einem InArgument schreiben. Dies vereinfacht das Szenario:

%Vor%

(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.

    
Tim Lovell-Smith 28.04.2010, 20:48
quelle
4

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)

%Vor%

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.

    
sfuqua 26.03.2014 00:24
quelle
2

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.

    
gaurav rawat 11.04.2011 08:16
quelle