Enlazar una propiedad de actividad personalizada a un control de diseñador
La operación de enlazar un control de diseñador de cuadro de texto a un argumento de actividad es bastante sencillo; sin embargo, la operación de enlazar un control de diseñador complejo (como un cuadro combinado) a un argumento de actividad puede presentar desafíos. En este tema se analiza la forma de enlazar un argumento de actividad a un control de cuadro combinado en un diseñador de actividad personalizado.
Crear el convertidor de elemento de cuadro combinado
Cree una nueva solución vacía en Visual Studio denominada CustomProperty.
Cree una nueva clase denominada ComboBoxItemConverter. Agregue una referencia a System.Windows.Data y haga que la clase derive de IValueConverter. Haga que Visual Studio implemente la interfaz para generar códigos auxiliares para
Convert
yConvertBack
.Agregue el siguiente código al método
Convert
. Este código convierte el InArgument<T> de tipo String de la actividad en el valor que se va a colocar en el diseñador.ModelItem modelItem = value as ModelItem; if (value != null) { InArgument<string> inArgument = modelItem.GetCurrentValue() as InArgument<string>; if (inArgument != null) { Activity<string> expression = inArgument.Expression; VisualBasicValue<string> vbexpression = expression as VisualBasicValue<string>; Literal<string> literal = expression as Literal<string>; if (literal != null) { return "\"" + literal.Value + "\""; } else if (vbexpression != null) { return vbexpression.ExpressionText; } } } return null;
La expresión del fragmento de código anterior también se pueden crear mediante CSharpValue<TResult> en lugar de VisualBasicValue<TResult>.
ModelItem modelItem = value as ModelItem; if (value != null) { InArgument<string> inArgument = modelItem.GetCurrentValue() as InArgument<string>; if (inArgument != null) { Activity<string> expression = inArgument.Expression; CSharpValue<string> csexpression = expression as CSharpValue<string>; Literal<string> literal = expression as Literal<string>; if (literal != null) { return "\"" + literal.Value + "\""; } else if (csexpression != null) { return csexpression.ExpressionText; } } } return null;
Agregue el siguiente código al método
ConvertBack
. Este código vuelve a convertir el elemento de cuadro combinado de entrada en un InArgument<T>.// Convert combo box value to InArgument<string> string itemContent = (string)((ComboBoxItem)value).Content; VisualBasicValue<string> vbArgument = new VisualBasicValue<string>(itemContent); InArgument<string> inArgument = new InArgument<string>(vbArgument); return inArgument;
La expresión del fragmento de código anterior también se pueden crear mediante CSharpValue<TResult> en lugar de VisualBasicValue<TResult>.
// Convert combo box value to InArgument<string> string itemContent = (string)((ComboBoxItem)value).Content; CSharpValue<string> csArgument = new CSharpValue<string>(itemContent); InArgument<string> inArgument = new InArgument<string>(csArgument); return inArgument;
Agregar ComboBoxItemConverter al diseñador personalizado de una actividad
Agregue un nuevo elemento al proyecto. En el cuadro de diálogo Nuevo elemento, seleccione el nodo de flujo de trabajo y seleccione Diseñador de actividad como tipo del nuevo elemento. Asigne al elemento el nombre CustomPropertyDesigner.
Agregue un cuadro combinado al nuevo diseñador. En la propiedad Items, agregue un par de elementos al cuadro combinado, con valores de "Item1" y "Item2" para Content.
Modifique el XAML del cuadro combinado para agregar el nuevo convertidor de elemento como el convertidor de elemento que se va a utilizar para el cuadro combinado. El convertidor se agrega como un recurso en el segmento ActivityDesigner.Resources y especifica el convertidor en el atributo Converter para ComboBox. Observe que el espacio de nombres del proyecto se especifica en los atributos de espacios de nombres para el diseñador de actividad; si el diseñador se va a utilizar en un proyecto diferente, será necesario cambiar este espacio de nombres.
<sap:ActivityDesigner x:Class="CustomProperty.CustomPropertyDesigner" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c="clr-namespace:CustomProperty" xmlns:sap="clr-namespace:System.Activities.Presentation;assembly=System.Activities.Presentation" xmlns:sapv="clr-namespace:System.Activities.Presentation.View;assembly=System.Activities.Presentation"> <sap:ActivityDesigner.Resources> <ResourceDictionary> <c:ComboBoxItemConverter x:Key="comboBoxItemConverter"/> </ResourceDictionary> </sap:ActivityDesigner.Resources> <Grid> <ComboBox SelectedValue="{Binding Path=ModelItem.Text, Mode=TwoWay, Converter={StaticResource comboBoxItemConverter}}" Height="23" HorizontalAlignment="Left" Margin="132,5,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120" ItemsSource="{Binding}"> <ComboBoxItem>item1</ComboBoxItem> <ComboBoxItem>item2</ComboBoxItem> </ComboBox> </Grid> </sap:ActivityDesigner>
Cree un nuevo elemento de tipo CodeActivity. El código predeterminado creado por el IDE para la actividad será suficiente en este ejemplo.
Agregue el atributo siguiente a la definición de clase:
[Designer(typeof(CustomPropertyDesigner))]
Esta línea asocia el nuevo diseñador a la nueva clase.
La nueva actividad debe estar asociada ahora al diseñador. Para probar la nueva actividad, agréguela a un flujo de trabajo y establezca el cuadro combinado en los dos valores. La ventana Propiedades debe actualizarse para reflejar el valor de cuadro combinado.