Partilhar via


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

  1. Crie uma nova solução vazia no Visual Studio chamada CustomProperty.

  2. 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 e ConvertBack.

  3. 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;
    
  4. 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

  1. 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.

  2. 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".

  3. 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>
    
  4. Crie um novo item do tipo CodeActivity. O código padrão criado pelo IDE para a atividade será suficiente para este exemplo.

  5. 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.