2

子アクティビティのデザイナーの 1 つから、デザイン サーフェイス (この場合は 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これらへのバインディングが失敗するため、無効なエラーが発生します。

Implementationキャリア アクティビティ (たとえば、シーケンス) に を追加し、ActivityBuilder にあるすべての変数と引数をキャリアに追加するという提案されたハックを見てきました。

これは臭い。

より良い方法はありますか?

4

2 に答える 2

1

ないと思います。あなたの Google 検索は、ティムがほとんど同じ結果を思いついたフォーラムでこの質問を見つけたと思います。

ModelItem がカスタム関数を追加して呼び出し、独自のチェックを行うアクティビティであるとすれば、解決策があるかもしれません。そうすれば、CacheMetadata とアクティビティ ビルダーの両方から関数を呼び出すことができます。

于 2011-05-19T06:21:03.200 に答える
0

ハック。ハックに他なりません。

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 をアクティビティに変換するより良い方法はありますか?

于 2011-05-18T20:53:13.000 に答える