如何在工作流中的运行时(在自定义活动执行方法中)将自定义活动结果分配给根级别变量?

时间:2012-05-01 10:29:30

标签: workflow-foundation-4 workflow-activity

假设我有一个包含3个自定义活动的工作流,这些活动放在序列活动中。我在序列活动级别(Root)创建了一个布尔变量(将其命名为“FinalResult”)以保存结果。我的意图是,我希望在完成活动后将每个自定义活动结果分配给自定义活动执行方法中的根级别变量(“FinalResult”)。

我可以通过在Custom Activity中声明输出参数并在设计策略时手动将变量名设置在活动的属性窗口中来实现。

但我不想让最终用户这样做。我希望最终用户拖放活动并在“FinalResult”变量上写条件。在内部,我必须通过编程方式在“FinalResult”变量中维护活动结果。

最后,我想在“FinalResult”变量中维护工作流状态,并随时随地访问它。

我在下面尝试了这样的错误“属性不存在”。

    WorkflowDataContext dataContext = context.DataContext;
    PropertyDescriptorCollection propertyDescriptorCollection = dataContext.GetProperties();
    foreach (PropertyDescriptor propertyDesc in propertyDescriptorCollection)
    {
        if (propertyDesc.Name == "FinalResult")
             {
                 object data = propertyDesc.GetValue(dataContext);// as WorkUnitSchema;
                 propertyDesc.SetValue(dataContext, "anil");
                 break;
             }
    }

请告知我们相同的解决方案。

1 个答案:

答案 0 :(得分:0)

我一直这样做。

只需在您的活动中实施IActivityTemplateFactory即可。当拖放到设计图面上时,设计人员将确定您的活动(或正在删除的任何内容)是否实现此界面。如果是,它将构造一个实例并调用Create方法。

在此方法中,您可以1)实例化您的Activity并2)配置它。配置它的一部分是将您的活动属性绑定到工作流中的其他活动参数和/或变量。

有几种方法可以做到这一点。 最简单,要求 这些参数/变量具有众所周知的名称。在这种情况下,您可以通过

简单地绑定它们
return new MyActivity
{
    MyInArgument = new VisualBasicValue<object>(MyActivity.MyInArgumentDefaultName),
};

其中MyActivity.MyInArgumentDefaultName是您要绑定的参数或变量的名称。

或者,如果该变量/参数是由用户命名的......那么你就是一个受伤的世界。基本上,你必须

  1. 将传递给Create方法的DependencyObject target转换为ActivityDesigner
  2. 从该AD获取ModelItem
  3. 走向ModelItem树,直到找到正确类型的参数/值
  4. 使用其名称创建VisualBasicValue
  5. 走向ModelItem树是 super duper hard 。它有点像反映一个对象图,但更糟。如果你必须这样做,你可以期望你必须完全了解ModelItem的工作原理,然后进行很多的调试(将所有内容写下来 - 地狱,视频)以便查看你必须如何走向图形,你在路上遇到什么类型,以及如何获得它们的“名称”(提示 - 它通常不是ModelItem上的Name属性!)。我必须开发大量的自定义代码来遍历ModelItem树,寻找args / vars,以实现拖放式忘记用户体验。它不好玩,而且不完美。抱歉,我无法发布该代码。