Udostępnij za pośrednictwem


Wiązanie niestandardowych właściwości działań z kontrolką projektanta

Powiązanie kontrolki projektanta pól tekstowych z argumentem działania jest dość proste; powiązanie złożonej kontrolki projektanta (na przykład pola kombi) z argumentem działania może jednak stanowić wyzwanie. W tym temacie omówiono sposób powiązania argumentu działania z kontrolką pola kombi w niestandardowym projektancie działań.

Tworzenie konwertera elementów pola kombi

  1. Utwórz nowe puste rozwiązanie w programie Visual Studio o nazwie CustomProperty.

  2. Utwórz nową klasę o nazwie ComboBoxItemConverter. Dodaj odwołanie do elementu System.Windows.Data i utwórz klasę pochodzącą z klasy IValueConverter. Zaimplementuj interfejs w programie Visual Studio, aby wygenerować wycinki dla elementów Convert i ConvertBack.

  3. Dodaj następujący kod do metody Convert: Ten kod konwertuje typ String działania InArgument<T> na wartość, która ma zostać umieszczona w projektancie.

    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;
    

    Wyrażenie w powyższym fragmencie kodu można również utworzyć przy użyciu polecenia CSharpValue<TResult> zamiast 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. Dodaj następujący kod do metody ConvertBack: Ten kod konwertuje przychodzący element pola kombi z powrotem na InArgument<T>element .

    // 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;
    

    Wyrażenie w powyższym fragmencie kodu można również utworzyć przy użyciu polecenia CSharpValue<TResult> zamiast 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;
    

Dodawanie elementu ComboBoxItemConverter do niestandardowego projektanta działania

  1. Dodaj nowy element do projektu. W oknie dialogowym Nowy element wybierz węzeł Przepływ pracy i wybierz pozycję Działanie Projektant jako typ nowego elementu. Nadaj elementowi nazwę CustomProperty Projektant.

  2. Dodaj pole kombi do nowego projektanta. We właściwości Items dodaj kilka elementów do pola kombi z wartościami Zawartości "Item1" i "Item2".

  3. Zmodyfikuj kod XAML pola kombi, aby dodać nowy konwerter elementów jako konwerter elementów, który ma być używany dla pola kombi. Konwerter jest dodawany jako zasób w działaniu Projektant. Segment zasobów i określa konwerter w atrybucie Konwerter dla elementu ComboBox. Należy pamiętać, że przestrzeń nazw projektu jest określona w atrybutach przestrzeni nazw dla projektanta działań; Jeśli projektant ma być używany w innym projekcie, ta przestrzeń nazw musi zostać zmieniona.

    <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. Utwórz nowy element typu CodeActivity. Domyślny kod utworzony przez środowisko IDE dla działania będzie wystarczający dla tego przykładu.

  5. Dodaj następujący atrybut do definicji klasy:

    [Designer(typeof(CustomPropertyDesigner))]
    

    Ten wiersz kojarzy nowy projektant z nową klasą.

Nowe działanie powinno być teraz skojarzone z projektantem. Aby przetestować nowe działanie, dodaj je do przepływu pracy i ustaw pole kombi na dwie wartości. Okno właściwości powinno zostać zaktualizowane, aby odzwierciedlić wartość pola kombi.