首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ActivityDesigner中验证一个活动?

从ActivityDesigner中验证一个活动?
EN

Stack Overflow用户
提问于 2011-05-18 20:28:40
回答 2查看 407关注 0票数 2

我想从子活动的设计器中验证设计图面内的工作流(在本例中是Visual )。我想阻止用户前进,直到其他错误得到纠正,以简化以后的设计经验。

天真的实现不起作用:

代码语言:javascript
复制
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 (它不是一个活动,不能传递给Validate)包含在工作流根上定义的任何和所有变量和参数。因此,当您试图验证根的第一个子级(Implementation)时,当任何绑定失败时,您都会得到无效的错误。

我已经看到了一些建议中的黑客,您可以将Implementation添加到载体活动(例如,序列)中,然后将变量和ActivityBuilder中找到的参数添加到载体中。

太臭了。

有更好的办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-18 20:53:13

黑客。只有黑客。

代码语言:javascript
复制
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转换为一个活动而不序列化它?

票数 0
EN

Stack Overflow用户

发布于 2011-05-19 06:21:03

我不认为有。我猜你的谷歌搜索在论坛上搜索到的问题与提姆得出的结果差不多。

假设ModelItem是您的活动,添加一个自定义函数来调用并进行您自己的检查,那么可能有一个解决方案。这样,您就可以从CacheMetadata和活动构建器调用函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6050636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档