WF 4相同活动的不同ID

时间:2015-04-16 14:04:34

标签: workflow workflow-foundation-4 workflow-foundation workflow-activity

由于我的应用程序中存在奇怪的行为,因此在调用WorkflowInvoker.Invoke之前,我不得不重新加载设计器。

wd.Flush();
SaveXamlFile(currentXamlPath, wd.Text);

我只是刷新内容,并将wd.Text写入文件。

//cleanup the previous designer
if (wd != null)
{
    wd.ModelChanged -= new EventHandler(Designer_ModelChanged);
}

//designer
wd = new WorkflowDesigner();
designerArea.Child = wd.View;
this.DebuggerService = this.wd.DebugManagerView;

//property grid
propertiesArea.Child = wd.PropertyInspectorView;

//event handler
wd.ModelChanged += new EventHandler(Designer_ModelChanged);

//error service
wd.Context.Services.Publish<IValidationErrorService>(errorService);


wd.Context.Items.Subscribe<Selection>(OnItemSelected);

然后我重新创建WorkflowDesigner的新实例并加载以前保存的文件。

wd.Load(currentXamlPath);

我调用了WorkflowInvoker.Invoke,在我的自定义活动中,我从CodeActivity获取了它的名字:enter image description here 好的,直到现在,我有一个1.2 Id。

我想通过其ModelItem更新此Activity的一些字段,以便立即在GUI中显示它们。

IEnumerable<ModelItem> activityCollection = currentWorkflow.Find(currentWorkflow.Root, typeof(Activity));

但问题出现了:enter image description here

我找不到我的Activity id那里。现在从1.2变为2.为什么会发生这种情况?

我试图从我的Activity Execute方法发送这个引用并通过ref搜索它,但我得到的只是空值。

ModelItem temp = activityCollection.FirstOrDefault((m) => (m.GetCurrentValue() == a));

我确信我在这里遗漏了一些东西,但我无法弄清楚它是什么。

1 个答案:

答案 0 :(得分:0)

我找到了解决方法:

在我的自定义活动中,我添加了一个Guid属性,并覆盖了CacheMetadata:

public Guid unique { get; set; }

protected override void CacheMetadata(CodeActivityMetadata metadata)
{
    if (unique.ToString() == "00000000-0000-0000-0000-000000000000")
        unique = Guid.NewGuid();
}

当我在设计器上拖动活动时,会生成唯一ID。我确保只调用一部分代码。  这是为什么?

因为在这样的电话之后,

IEnumerable<ModelItem> activityCollection = currentWorkflow.Find(currentWorkflow.Root, typeof(Activity));

活动集合中的每个模型都包含该属性(Guid类型的唯一),其中包含在CacheMetadata中进行的第一个赋值。我无法解释这种行为,我只是考虑到了这一点。

谁再次调用CacheMetadata?像这样的东西:

Activity root = ActivityXamlServices.Load(currentXamlPath);
WorkflowInspectionServices.CacheMetadata(root);

因此,Guid已经改变,其实用性已经消失。

这样,我就可以获取我的自定义活动的ModelItem,并更新一些立即显示在GUI中的属性。