Workflow Foundation新手,因此对于许多人来说这可能是一个基本问题。
我有一个工作流设计器(客户端)/服务器应用程序。 在设计器中,我可以将工作流程上传到服务器,服务器将它们存储在数据库中。设计人员可以请求从服务器下载工作流程。下载后,我们可以在设计器中对其进行修改并重新上传。 为此,我需要在工作流程中添加某种ID / Key。
最好的方法是什么?
我正在考虑向ActivityBuilder添加一个属性,但这样做会将它添加到参数列表中,这似乎不正确......
非常感谢任何帮助
嗨@Will,我把它附加到了活动,但我无法让它工作。我没有使用像WorkflowRecord这样的任何模型,它只是一个基本的设计者。
我使用_workflowDesigner.Save(path);保存它或_workflowDesigner.Load(路径);加载它。
我创建并添加附加属性
attachProp = new AttachedProperty<int?>()
{
Name = "Key",
IsBrowsable = true,
Getter = (modelItem) => 5,
Setter = ((modelItem, keyValue) => modelItem.Properties["Key"].SetValue(keyValue)),
OwnerType = typeof(Activity)
};
_workflowDesigner.Context.Services.GetService<AttachedPropertiesService>().AddProperty(attachProp);
如果我尝试访问附加属性,它会抛出异常(不包含密钥定义)
dynamic mainActivity = ((_workflowDesigner.Context.Services.GetService<ModelService>().Root.GetCurrentValue() as ActivityBuilder).Implementation as Activity);
int? testValue = mainActivity.Key; //Exception, Activity' does not contain a definition for 'Key'
我通读了[post](http://blogs.msdn.com/b/kushals/archive/2010/01/04/base-designer-with-additional-adornments.aspx)来将附加属性添加到活动
答案 0 :(得分:1)
通过AttachablePropertyServices Class附加属性。
public class WorkflowRecord
{
static AttachableMemberIdentifier Id =
new AttachableMemberIdentifier(typeof(Guid), "Id");
public static object GetCommentText(object instance)
{
object viewState;
AttachablePropertyServices.TryGetProperty(instance, Id, out viewState);
return viewState;
}
public static void SetCommentText(object instance, object value)
{
AttachablePropertyServices.SetProperty(instance, Id, value);
}
}
您可以使用它来获取或设置工作流实例上的数据库ID,并将其序列化/反序列化为xaml。
<Activity
xmlns:me="clr-namespace:Herp;assembly=derp"
me:WorkflowRecord.Id="This is a guid lol"
x:HideAdditionalAttributesBecauseThisIsAnExample="true" />
有关详情,请参阅this blog post on msdn