Vinculando uma propriedade de atividade personalizada a um controle de designer
Vincular um controle de designer de caixa de texto a um argumento de atividade é bastante simples; No entanto, vincular um controle de designer complexo (como uma caixa de combinação) a um argumento Activity pode apresentar desafios. Este tópico discute como vincular um argumento de atividade a um controle de caixa de combinação em um designer de atividade personalizado.
Criando o conversor de itens da caixa de combinação
Crie uma nova solução vazia no Visual Studio chamada CustomProperty.
Crie uma nova classe chamada ComboBoxItemConverter. Adicione uma referência a System.Windows.Data e faça com que a classe derive de IValueConverter. Peça ao Visual Studio que implemente a interface para gerar stubs para
Convert
eConvertBack
.Adicione o seguinte código ao método
Convert
. Este código converte o tipo String da InArgument<T> atividade 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 trecho de código acima 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 método
ConvertBack
. Esse código converte o item da caixa de combinação de entrada de volta em um InArgument<T>arquivo .// 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 trecho de código acima 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 ao designer personalizado de uma atividade
Adicione um novo item ao projeto. Na caixa de diálogo Novo Item, selecione o nó Fluxo de trabalho e selecione Designer de atividade como o tipo do novo item. Nomeie o item CustomPropertyDesigner.
Adicione uma caixa de combinação ao novo designer. Na propriedade Items, adicione alguns itens à caixa de combinação, com os valores Content de "Item1" e "Item2".
Modifique o XAML da 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 ActivityDesigner.Resources e especifica o conversor no atributo Converter para o ComboBox. Observe que o namespace do projeto é especificado nos atributos namespaces para o designer de atividade; Se o designer for usado em um projeto diferente, esse namespace precisará ser alterado.
<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 a atividade será suficiente para este exemplo.
Adicione o seguinte atributo à definição de classe:
[Designer(typeof(CustomPropertyDesigner))]
Esta linha associa o novo designer à nova classe.
A nova atividade agora deve ser associada ao designer. Para testar a nova atividade, adicione-a a um fluxo de trabalho e defina a caixa de combinação com os dois valores. A janela de propriedades deve ser atualizada para refletir o valor da caixa de combinação.