Associando uma propriedade personalizada de atividade a um controle de designer
Associar um controle de designer caixa de texto para um argumento de atividade é relativamente simples; associar um controle complexo do designer (como uma caixa combo) para um argumento de atividade pode apresentar desafios, no entanto. Este tópico discute como associar um argumento de atividade a um controle caixa de combinação em um designer personalizado de atividade.
Criando o conversor de item da caixa de combinação
Crie uma nova solução vazia no Visual Studio chama CustomProperty.
Crie uma nova classe chamada ComboBoxItemConverter. Adicione uma referência a System.Windows.Data, e tem a classe derivar de IValueConverter. Tenha o Visual Studio fornecedores da interface para gerar stub para
Convert
eConvertBack
.Adicione o seguinte código ao
Convert
método. Este código a seguir converte InArgument<T> de atividade do tipo String para o valor a ser colocado no designer.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;
A expressão no snippet de código anterior também pode ser criada usando CSharpValue<TResult> em vez 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;
Adicione o seguinte código ao
ConvertBack
método. Este código a seguir converte o item de entrada da caixa de combinação de volta a 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;
A expressão no snippet de código anterior também pode ser criada usando CSharpValue<TResult> em vez 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;
Adicionando o ComboBoxItemConverter o designer personalizado de uma atividade
Adicionar um novo item ao projeto. Na caixa de diálogo add new item, selecione o nó de fluxo de trabalho e selecione o designer de atividade como o tipo do novo item. Nomeie o item CustomPropertyDesigner.
Adicione uma caixa de combinação para o novo designer. A propriedade itens, adicione um par itens à caixa de combinação, com valores de conteúdo de “Item1” e “de” Item2.
Modifique o XAML caixa de combinação para adicionar o novo conversor de item como o conversor de item a ser usado para a caixa de combinação. O conversor é adicionado como um recurso no segmento de ActivityDesigner.Resources, e especifica o conversor no atributo de conversor para ComboBox. Observe que o namespace do projeto está especificada em atributos namespaces para o designer de atividade; se o designer deve ser usada em um projeto diferente, esse namespace deverá ser alterada.
<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>
Crie um novo item do tipo CodeActivity. O código padrão criado pelo IDE para atividades será suficiente para esse exemplo.
Adicione o atributo a seguir para a definição de classe:
[Designer(typeof(CustomPropertyDesigner))]
Esta linha associa o novo designer com a nova classe.
A nova atividade agora deve ser associada com o designer. Para testar a nova atividade, adicioná-lo a um fluxo de trabalho, e defina a caixa de combinação para dois valores. A janela propriedades deve atualizar para refletir o valor de caixa combo.