Validation 是否从ActivityDesigner中验证活动?
我想从一个子活动的设计器中验证设计图面(在本例中为Visual Studio)中的工作流。为了简化以后的设计体验,我想阻止用户在其他错误得到纠正之前继续前进 naiive实现不起作用:Validation 是否从ActivityDesigner中验证活动?,validation,workflow-foundation-4,workflow-activity,Validation,Workflow Foundation 4,Workflow Activity,我想从一个子活动的设计器中验证设计图面(在本例中为Visual Studio)中的工作流。为了简化以后的设计体验,我想阻止用户在其他错误得到纠正之前继续前进 naiive实现不起作用: var activity = (this.ModelItem.Root.GetCurrentValue() as ActivityBuilder) .Implementation as Activity; var validationResult = ActivityVal
var activity = (this.ModelItem.Root.GetCurrentValue() as ActivityBuilder)
.Implementation as Activity;
var validationResult = ActivityValidationServices.Validate(activity);
if (validationResult.Errors.Count > 0))
{
MessageBox.Show("The Workflow is invalid. Fix it.", "Derp");
return;
}
问题在于ActivityBuilder(它不是活动,不能传递给验证
)包含工作流根目录上定义的任何和所有变量和参数。因此,当您尝试验证根目录的第一个子目录(实现
)时,会出现无效错误,因为对这些目录的任何绑定都会失败
我见过一些建议的黑客,你将实现
添加到载体活动中(比如序列),然后将ActivityBuilder中的所有变量和参数添加到载体中
这真臭
有更好的方法吗?黑客。只有黑客
var sb = new StringBuilder();
using (var tw = new StringWriter(sb))
using (var xw = ActivityXamlServices.CreateBuilderWriter(
new XamlXmlWriter(tw, new XamlSchemaContext())))
{
XamlServices.Save(xw,
this.ModelItem.Root.GetCurrentValue() as ActivityBuilder);
tw.Flush();
}
using(var tr = new StringReader(sb.ToString()))
using (var xr = ActivityXamlServices.CreateReader(
new XamlXmlReader(tr, new XamlSchemaContext())))
{
var activity = ActivityXamlServices.Load(xr);
var validationResult = ActivityValidationServices.Validate(activity);
if (!validationResult.IsValid())
{
MessageBox.Show("OMG what an awful hack.", "Validation Sucks");
return;
}
}
有没有更好的方法可以将ActivityBuilder转换为活动而不序列化???我认为没有。我猜你的谷歌搜索在论坛上出现了一个问题,蒂姆在那里得到了几乎相同的结果
假设ModelItem是您的活动,添加要调用的自定义函数并进行自己的签入,那么可能会有一个解决方案。这样你就可以从CacheMatadata和你的activity builder中调用函数。在5分钟内被Google索引。是的,这是我考虑的另一个解决方案。。。。让我的活动实现我自己的iHasholesInMedDesign接口,我可以使用该接口1)验证没有NativeActivityMetadata的数据,2)在没有NativeActivityContext的情况下执行(根据示例数据测试配置)。它就像一个兔子洞。我希望尽可能多地使用框架的功能,并尽可能少地依赖这些类型的“变通方法”。。。