Отображение входных параметров на поверхности дизайна - PullRequest
0 голосов
/ 03 апреля 2012

Я пытаюсь понять, как составить собственное представление WF4 Activity.Например, у меня есть действие с именем AssignMemberDates, которое имеет 2 аргумента IN: DataType (из List <>) и RecordType (также из List <>).У меня есть 10 разных типов DateType и 3 разных типа RecordTypes.Вместо создания 30 видов деятельности я хочу один вид деятельности.Когда я перетаскиваю его на поверхность WF и назначаю свои 2 входа, мне хотелось бы чего-то большего, чем показ общего контейнера Activity.Давайте посмотрим, смогу ли я (используя ASCII) нарисовать это ...

Что я получу сейчас:

+-------------------------------+
| [ICON] AssignMemberDates      |  
+-------------------------------+

Что я хочу:

+-------------------------------+
| [ICON] AssignMemberDates      |  
|   Pending / BenefitMonth      |  
+-------------------------------+

Делает ли этоимеет смысл?Я знаю, что мне нужно создать XAML, но я не знаю, как захватить InArguments (перечисления) и отобразить их в виде текста.Я НЕ хочу сделать это редактором.Я просто хочу видеть InArguments в действии на поверхности проектирования.

Обновление:

Я использую перечисления на InArguments, поэтому разработчики в будущем ограниченына что они могут войти по свойствам дизайнера.Это так просто, как:

public InArgument<DateTypeList> DateType { get; set; }
public InArgument<RecordTypeList> RecordType { get; set; }

Я знаю, как получить строку из моего перечисления.Я начинающий дизайнер и прошу помощи с этим.Я не знаю, как отобразить значения свойств на поверхности конструктора, и, кажется, существует тонна отображаемых «виджетов», которые я мог бы использовать.

Я начал сследующий XAML, но не очень далеко - и похоже, что это больше похоже на вход, аналогичный тому, который вы видите на вкладке свойств:

<sap:ActivityDesigner x:Class="PSI.Workflow.Activities.SouthCarolina.SC1AssignMemberDateDesigner"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sap="clr-namespace:System.Activities.Presentation;assembly=System.Activities.Presentation"
    xmlns:sapv="clr-namespace:System.Activities.Presentation.View;assembly=System.Activities.Presentation" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" d:DesignHeight="86" d:DesignWidth="200">
    <StackPanel>
        <sapv:ExpressionTextBox MaxLines="1" ></sapv:ExpressionTextBox>
        <sapv:ExpressionTextBox MaxLines="1"></sapv:ExpressionTextBox>
    </StackPanel>
</sap:ActivityDesigner>

Я не знаю, как принять параметр ввода 2значения и отображать их.Если бы я был в HTML, я бы просто создал элемент управления и затем предоставил значение, которое я хотел во время загрузки страницы.Я также не хочу, чтобы элементы дисплея были сложены, а располагались рядом друг с другом с помощью "/".

Имеет ли это смысл?

Обновление 2:

  1. Почему я использую перечисления?- Мы используем перечисления по всей базе кода, чтобы ограничить входные данные известными значениями.Мы не хотим использовать «магические строки», и вся наша кодовая база, 2 миллиона строк и более, зависит от использования сотен перечислений.Преобразование перечислений в строки не является проблемой.Мы также хотим ограничить входные данные для этой деятельности известными значениями (перечислениями).Например:

    public InArgument<DateTypeList> DateType { get; set; }
    public InArgument<RecordTypeList> RecordType { get; set; }
    
    protected override void Execute(NativeActivityContext context)
    {
    // In Arguments...
    var dateType = DateType.Get(context);
    var recordType = RecordType.Get(context);
    // Let's get what we need from the context...
    var member = context.Member();
    var mtd = context.MemberTransaction();
    var cutoffDates = context.CutoffDates();
    DateTime? startDate = null;
    DateTime? endDate = null;
    
    switch (dateType)
    {
        case DateTypeList.ARC:
            startDate = Helpers.GetDate(cutoffDates, CutoffDateType.EnrollmentStart, mtd.assignable.ToBoolean()).AddYears(1);
            break;
    
        case DateTypeList.AutoAssignment:
            startDate = Helpers.GetDate(cutoffDates, CutoffDateType.AutoAssignment, mtd.assignable.ToBoolean());
            break;
    
    }
    Helpers.AssignDate(ref member, dateType, recordType, startDate.Value, endDate);
    

    }

  2. Нет, я никогда не пытался создать что-то подобное.У меня нет опыта XAMLX, и я начинаю с нуля.Я просто хочу просто перенести строковое представление enum на поверхность конструктора.Таким образом, когда мы просматриваем рабочий процесс с нетехническими людьми, на самой операции четко отображается, какие значения были переданы во время настройки операции.

1 Ответ

0 голосов
/ 03 мая 2012

Хорошо, я сделаю удар. Возможно, вам придется оставить мне комментарии, чтобы получить дополнительную информацию.

Во-первых, ваша деятельность не имеет , чтобы сделать все ее свойства InArgument's. Это только в том случае, если значение свойства изменяется в время выполнения . Если, как это выглядит в вашем случае, значения этих свойств установлены на время разработки (когда они отбрасываются на поверхность проектирования), тогда вы можете просто сделать их обычными свойствами.

public sealed class MyActivity : NativeActivity
{
    public DateTypeList DateType { get; set; }
    public RecordTypeList RecordType { get; set; }
    // snip

Чтобы отобразить их значение, есть пара разных способов. Три TextBlocks, первый связан с DateTime, второй имеет буквенную косую черту "\", а третий связан с RecordType. Или вы можете использовать MultiBinding и просто настроить StringFormat с косой чертой.

Это довольно просто. Вот некоторый xaml-подобный псевдокод, который демонстрирует (т.е. он не проверен)

<StackPanel Orientation="Horizontal">
    <TextBlock Text="{{Binding ModelItem.DateType}" />
    <TextBlock Text="\" />
    <TextBlock Text="{{Binding ModelItem.RecordType }" />
</StackPanel>

Второй

<TextBlock>    
    <TextBlock.Text>        
        <MultiBinding StringFormat="{}{0}\{1}">            
            <Binding Path="ModelItem.DateType" />
            <Binding Path="ModelItem.DateType" />            
        </MultiBinding> 
    </TextBlock.Text>       
</TextBlock>    
...