Las respuestas anteriores son útiles, pero no fueron suficientes para mí. Eventualmente encontré un excelente artículo de 2012 en Microsoft .Net 4.5 Developer Guide: Binding a custom activity property to a designer control. Ese artículo fue casi la respuesta completa, excepto por un error menor en la clase de convertidor personalizado, y un defecto importante: esa técnica guardará un valor del ComboBox, pero no lo restaurará cuando vuelva a abrir su flujo de trabajo.
Ron Jacobs de Microsoft has another answer para diseñadores de actividades personalizadas. Terminé combinando los dos para obtener una solución de trabajo.
encargo del diseñador
El ModelToObjectValueConverter
era un recurso increíblemente útil, lo que me permite crear mi propio salto IValueConverter
. En el ObjectDataProvider
me ves cargando una lista de cadenas llamando a un método estático, People.GetPeople()
. El cuadro combinado se une a ese proveedor como el origen de elementos, pero se une el valor seleccionado para la propiedad persona en la actividad personalizada (continuación)
<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>
código personalizado Actividad
Tenga en cuenta que este utiliza una propiedad en lugar que un InArgument, que facilita la unión 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);
}
}
flujo de trabajo
Ahora la actividad personalizada, CodeActivity1
, se pueden arrastrar a un flujo de trabajo. Cuando haga una selección, el valor seleccionado aparecerá en el panel de propiedades. Guarde el flujo de trabajo. Cierra y vuelve a abrir. El valor seleccionado previamente persistirá según lo deseado.
¿Realmente quiere que su actividad personalizada para tener una InArgument en lugar de una propiedad? (public InArgument Arg {get; set;} vs. cadena pública Arg {get; set;}) –
@Tim, supongo que solo una propiedad estándar estaría bien también. –