2

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

我可以通过在自定义活动中声明输出参数并在设计策略时将变量名称在设计时手动放置在活动的属性窗口中来实现这一点。

但我不想让最终用户这样做。我只想让最终用户拖放活动并在“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;
             }
    }

请让我们知道可能的解决方案。

4

1 回答 1

0

我一直这样做。

只需在您的活动中实现IActivityTemplateFactory。当拖放到设计图面上时,设计器将确定您的活动(或任何被拖放的活动)是否实现此接口。如果是,它将构造一个实例并调用 Create 方法。

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

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

return new MyActivity
{
    MyInArgument = new VisualBasicValue<object>(MyActivity.MyInArgumentDefaultName),
};

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

或者,如果该变量/参数是由用户命名的......你会受到伤害。本质上,你必须

  1. target将传递给 Create 方法的 DependencyObject转换为ActivityDesigner
  2. 从该广告中获取 ModelItem
  3. 遍历 ModelItem 树,直到找到正确类型的参数/值
  4. 使用它的名字来创建你的 VisualBasicValue

沿着 ModelItem 树走是超级难的。它有点像反映对象图,但更糟。如果必须这样做,您可以期望,您必须完全了解 ModelItem 的工作原理,并进行大量调试(写下所有内容——见鬼,视频),以便了解您必须如何在图表上移动,一路上遇到什么类型,以及如何获取它们的“名称”(提示——它通常不是 ModelItem 上的 Name 属性!)。我不得不开发大量自定义代码来遍历 ModelItem 树以查找 args/vars 以实现拖放式用户体验。它不好玩,也不完美。我不能发布那个代码,对不起。

于 2012-05-02T15:27:16.653 回答