Le risposte precedenti sono utili ma non erano sufficienti per me. Alla fine ho trovato un articolo fantastico dal 2012, nella Guida per gli sviluppatori di .Net 4.5 di Microsoft: Binding a custom activity property to a designer control. Quell'articolo era quasi la risposta completa - tranne un piccolo errore nella classe del convertitore personalizzato, e un grosso difetto: quella tecnica salverà un valore dal ComboBox, ma non lo ripristinerà quando riaprirai il tuo flusso di lavoro.
Microsoft's Ron Jacobs has another answer per progettisti di attività personalizzate. Ho finito per combinare i due per ottenere una soluzione funzionante.
progettazione personalizzata
Il ModelToObjectValueConverter
era una risorsa incredibilmente utile, che mi permette di saltare creare il mio IValueConverter
. Nello ObjectDataProvider
mi vedi caricare un elenco di stringhe chiamando un metodo statico, People.GetPeople()
. Il ComboBox si lega a tale provider come sorgente voce, ma si lega il valore selezionato alla proprietà Persona sull'attività personalizzato (in basso)
<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>
codice personalizzato Attività
Si noti che questo utilizza una proprietà piuttosto di un InArgument, che rende più facile l'associazione del ComboBox.
[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
Ora l'attività personalizzata, CodeActivity1
, possono essere trascinati su un flusso di lavoro. Quando si effettua una selezione, il valore selezionato verrà visualizzato nel riquadro delle proprietà. Salva il flusso di lavoro. Chiudi e riapri. Il valore selezionato in precedenza persisterà come desiderato.
Vuoi davvero la vostra attività su misura per avere un'InArgument piuttosto che un immobile? (InArgument pubblico Arg {get; set;} vs. public string Arg {get; set;}) –
@Tim, suppongo che solo una proprietà standard andrebbe bene. –