Проверить активность из ActivityDesigner? - PullRequest
2 голосов
/ 19 мая 2011

Я хотел бы проверить рабочий процесс в области дизайна (в данном случае, 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 (который не a Activity и не может быть передан в Validate) содержит все переменные и аргументы , определенные в корне рабочего процесса.Поэтому, когда вы пытаетесь проверить первый дочерний элемент корня (Implementation), вы получаете недопустимые ошибки, так как любые привязки к ним не выполняются.

Я видел предложенные хаки, в которых вы добавляете Implementation кОператор перевозчика (скажем, Последовательность) и затем добавьте все Переменные и аргументы , найденные в ActivityBuilder, к перевозчику.

Это воняет.

Есть ли лучший способ?

Ответы [ 2 ]

1 голос
/ 19 мая 2011

Я не думаю, что есть.Я предполагаю, что ваш поиск в Google поднял этот вопрос на форумах, где Тим получил почти такой же результат.

Учитывая, что ModelItem - это ваша деятельность, добавление пользовательской функции для вызоваидти ваши собственные проверки могут быть решения.Таким образом, вы можете вызывать функцию как из CacheMetadata, так и из вашего компоновщика активности.

0 голосов
/ 19 мая 2011

Хаки. Ничего, кроме взлома.

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 в Activity без его сериализации ???

...