Validation 是否从ActivityDesigner中验证活动?

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

我想从一个子活动的设计器中验证设计图面(在本例中为Visual Studio)中的工作流。为了简化以后的设计体验,我想阻止用户在其他错误得到纠正之前继续前进

naiive实现不起作用:

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的情况下执行(根据示例数据测试配置)。它就像一个兔子洞。我希望尽可能多地使用框架的功能,并尽可能少地依赖这些类型的“变通方法”。。。