Associazione di una proprietà di attività personalizzata a un controllo di progettazioneBinding a custom activity property to a designer control

L'associazione di un controllo di progettazione casella di testo a un argomento di un'attività è abbastanza semplice; d'altra parte, l'associazione di un controllo di progettazione complesso (quale una casella combinata) a un argomento di un'attività può risultare problematica.Binding a text box designer control to an activity argument is fairly straightforward; binding a complex designer control (such as a combo box) to an activity argument may present challenges, however. In questo argomento viene illustrato come associare un argomento di un'attività a un controllo casella combinata in un ActivityDesigner personalizzato.This topic discusses how to bind an activity argument to a combo box control on a custom activity designer.

Creazione del convertitore dell'elemento casella combinataCreating the combo box item converter

  1. Creare una nuova soluzione vuota in Visual Studio 2010 denominata CustomProperty.Create a new empty solution in Visual Studio called CustomProperty.

  2. Creare una nuova classe denominata ComboBoxItemConverter.Create a new class called ComboBoxItemConverter. Aggiungere un riferimento a System.Windows.Data e fare in modo che la classe esegua la derivazione da IValueConverter.Add a reference to System.Windows.Data, and have the class derive from IValueConverter. Impostare Visual Studio in modo che implementi l'interfaccia per generare stub per Convert e ConvertBack.Have Visual Studio implement the interface to generate stubs for Convert and ConvertBack.

  3. Aggiungere al metodo Convert il seguente codice.Add the following code to the Convert method. Questo codice converte l'oggetto InArgument<T> di tipo String dell'attività nel valore da posizionare nella finestra di progettazione.This code converts the activity's InArgument<T> of type String to the value to be placed in the 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;  
    

    L'espressione nell'esempio di codice precedente può essere creata anche usando CSharpValue<TResult> anziché VisualBasicValue<TResult>.The expression in the above code snippet can also be created using CSharpValue<TResult> instead of 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. Aggiungere al metodo ConvertBack il seguente codice.Add the following code to the ConvertBack method. Questo codice converte l'elemento casella combinata in ingresso nuovamente in InArgument<T>.This code converts the incoming combo box item back to an 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;  
    

    L'espressione nell'esempio di codice precedente può essere creata anche usando CSharpValue<TResult> anziché VisualBasicValue<TResult>.The expression in the above code snippet can also be created using CSharpValue<TResult> instead of 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;  
    

Aggiunta di ComboBoxItemConverter all'ActivityDesigner personalizzatoAdding the ComboBoxItemConverter to the custom designer of an activity

  1. Aggiungere un nuovo elemento al progetto.Add a new item to the project. Nella finestra di dialogo Nuovo elemento, selezionare il nodo Flusso di lavoro, quindi selezionare ActivityDesigner come tipo del nuovo elemento.In the New Item dialog, select the Workflow node and select Activity Designer as the type of the new item. Denominare l'elemento CustomPropertyDesigner.Name the item CustomPropertyDesigner.

  2. Aggiungere una casella combinata alla nuova finestra di progettazione.Add a Combo Box to the new designer. Nella proprietà Items aggiungere un paio di elementi alla casella combinata, con i valori di contenuto di "Item1" e 'Item2."In the Items property, add a couple of items to the combo box, with Content values of "Item1" and 'Item2".

  3. Modificare il codice XAML della casella combinata in modo da aggiungere il nuovo convertitore di elementi come convertitore di elementi da usare per la casella combinata.Modify the XAML of the combo box to add the new item converter as the item converter to be used for the combo box. Il convertitore viene aggiunto come risorsa nel segmento ActivityDesigner.Resources e specifica il convertitore nell'attributo Converter di ComboBox.The converter is added as a resource in the ActivityDesigner.Resources segment, and specifies the converter in the Converter attribute for the ComboBox. Notare che lo spazio dei nomi del progetto viene specificato negli attributi degli spazi dei nomi di ActivityDesigner; se la finestra di progettazione deve essere usata in un progetto diverso, questo spazio dei nomi dovrà essere modificato.Note that the namespace of the project is specified in the namespaces attributes for the activity designer; if the designer is to be used in a different project, this namespace will need to be changed.

    <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. Creare un nuovo elemento di tipo CodeActivity.Create a new item of type CodeActivity. Il codice predefinito creato dall'IDE per l'attività sarà sufficiente per questo esempio.The default code created by the IDE for the activity will be sufficient for this example.

  5. Aggiungere l'attributo seguente alla definizione di classe:Add the following attribute to the class definition:

    [Designer(typeof(CustomPropertyDesigner))]  
    

    Con questa riga si associa la nuova finestra di progettazione alla nuova classe.This line associates the new designer with the new class.

La nuova attività dovrebbe ora essere associata alla finestra di progettazione.The new activity should now be associated with the designer. Per testare la nuova attività, aggiungerla a un flusso di lavoro e impostare la casella combinata sui due valori.To test the new activity, add it to a workflow, and set the combo box to the two values. La finestra delle proprietà dovrebbe essere aggiornata per riflettere il valore della casella combinata.The properties window should update to reflect the combo box value.