在设计图面上显示输入参数

本文关键字:输入 参数 显示 设计图 | 更新日期: 2023-09-27 18:29:58

我正试图弄清楚如何设计我自己的WF4活动表示。例如,我有一个名为AssignMemberDates的活动,它有两个IN参数:一个DataType(来自List<>)和一个RecordType(也来自List&lgt;>)。我有10种不同的日期类型和3种不同的记录类型。我想要的不是创建30个活动,而是单个活动。当我把它拖到WF表面并分配我的2个输入时,我想要的不仅仅是显示的通用"活动"容器。让我们看看我是否可以(使用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中,我会简单地创建一个<label/>控件,然后在页面加载期间提供我想要的值。我也不希望显示元素堆叠,而是用"/"并排分隔。

这更有意义吗?

更新2:

  1. 我为什么要用enums?-我们在整个代码库中使用枚举来将输入约束为已知值。我们不想使用"魔术串",我们所有的代码库,200多万行,都依赖于数百个枚举的使用。将枚举转换为字符串没有问题。我们还希望将此活动的输入限制为已知值(枚举)。例如:

    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的经验,我正在从头开始。我只想简单地将枚举的字符串表示转移到设计器表面。这样,当我们与非技术人员一起审查工作流时,它会在活动本身上清楚地显示在活动设置过程中传递的值。

在设计图面上显示输入参数

好吧,我来试试。你可能需要给我留言才能获得更多信息。

首先,您的活动没有使其所有属性成为InArgument。只有当属性的值在运行时发生更改时,才会发生这种情况。如果像您的案例中出现的那样,这些属性值是在设计时设置的(当它们被放置在设计图面上时),那么您可以将它们设置为常规属性。

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

要显示这些值,有几种不同的方法。三个TextBlock,第一个绑定到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>