将一个活动的OutArgument值传递给另一个活动的InArgument?

时间:2011-11-09 23:44:52

标签: workflow-foundation workflow-foundation-4

有没有办法将一个活动的OutArgument值传递给另一个活动的InArgument?或者,可以在设计时间内根据拖动活动的OutArguments在根活动容器中自动创建局部变量,这可以用于使用扩展名自动备份OutArgument的值?

我知道在WF4中使用标准方式看起来不可能。但有一些狂野的方式可以做到这一点吗?或模拟WF3的方式?

请发表您的任何想法。

由于

亚东

1 个答案:

答案 0 :(得分:4)

如果您希望在设计时已经填充了所有变量和活动的工作流程,也许您可​​以使用IActivityTemplateFactory进行锻炼。

public class TwoActivitiesBundle : IActivityTemplateFactory
{
    public Activity Create(DependencyObject target)
    {
        return new Sequence
        {
            Variables =
            {
                new Variable<int>("addResult"),
            },

            Activities =
            {
                new Add<int, int, int>
                {
                    Left = 10,
                    Right = 10,
                    Result = new VisualBasicReference<int>("addResult")
                },

                new WriteLine { Text = "Now I'll use 'addResult', as a value on the next activity" },

                new Subtract<int, int, int>
                {
                    Left = new VisualBasicValue<int>("addResult"),
                    Right = 10,
                },

                new WriteLine { Text = new VisualBasicValue<string>("\"Print addResultValue: \" & addResult")}
            }
        };
    }
}

简而言之, IActivityTemplateFactory 允许您将已构建和已填充的活动放到设计器中。然后将工厂(在本例中为 TwoActivitiesBundle )添加到设计人员的工具箱中,与任何其他活动一样:

new ToolboxItemWrapper(typeof(TwoActivitiesBundle), null, "My Bundle");

<小时/> 的额外:

如果您确实要将变量添加到父容器,可以使用target方法上收到的Create()参数来遍历工作流并找到这样的容器。

这是一个假设您将TwoActivitiesBundle放入Sequence中并向后者添加变量的示例:

public class TwoActivitiesBundle : IActivityTemplateFactory
{
    public Activity Create(DependencyObject target)
    {
        var sequenceModelItem = (target as WorkflowViewElement).ModelItem;

        sequenceModelItem
            .Properties["Variables"]
            .Collection
            .Add(new Variable<string>("myFirstDesignTimeVariable", "var text here"));


        // This activity writes "I've just created a new variable: var text here" to the console

        return new WriteLine
        {
            Text = new VisualBasicValue<string>("\"I've just created a new variable: \" & myFirstDesignTimeVariable");
        }
    }
}

正如您所见,here,ModelItem 代表编辑模型中的单个项目。因此,您可以使用RootParentParents属性遍历所有工作流程。然后你可以编辑每个ModelItem属性,就像我在上面的例子中给你看的那样。请注意,这非常费力,可能需要您在此过程中采取一些假设。