我想从一个子活动的设计器中验证设计图面(在本例中为 Visual Studio)内的工作流。我想阻止用户继续前进,直到其他错误得到纠正,以简化以后的设计体验。
天真的实现不起作用:
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 (它不是Activity 并且不能传递给)包含在工作流的根上定义的Validate
任何和所有变量和参数。因此,当您尝试验证根 ( Implementation
) 的第一个子节点时,您会收到无效错误,因为对这些子节点的任何绑定都会失败。
我已经看到建议的黑客攻击,您可以将 Activity 添加Implementation
到运营商 Activity(例如,序列),然后将 ActivityBuilder 中的所有变量和参数添加到运营商。
这很臭。
有没有更好的办法?