質問

WF 4.0のカスタムアクティビティ/カスタムアクティビティファクトリ/カスタムデザイナーで検証を行う時期と方法については不明です。

検証エラーのサポートを提供していると思われるアクティビティ内の唯一の場所は、 CacheMetadata メソッド内です(これは設計プロセス中に複数回呼び出されると思います)。これは、検証を行うべき場所ですか? ActivityDesigner内で検証のサポートはありますか?

役に立ちましたか?

解決

はい、アクティビティのCacheMetadataは検証を行うべき場所です。検証は、デザイナーだけでなくワークフローランタイムにも適用される概念です。 (これは、検証エラーがあるコンパイル済みまたは宣言型のワークフローを実行しようとすることができるという事実からわかりますが、実行すると例外がスローされます。)

例:

protected override void CacheMetadata(ActivityMetadata metadata)
{
   if (this.Body == 0) metadata.AddValidationError(
     new ValidationError(
       "You forgot to supply a body for (this activity)",
       /*iswarning = */ true, 
       "Body"));
}

ActivityMetadata.AddValidationError を参照)

2番目の質問は、ActivityDesigner側から検証を追加するためのサポートがありますか?答えは「いいえ、そうではありません」です。ActivityDesignerの上に「カスタム検証」を追加するカスタムWPFとデータバインディングを行うことができます。AttachedPropertiesServiceを使用してアクティビティクラスで独自のSatisfiesConstraintsプロパティを定義することもできます。しかし、これは余分な作業であり、実行時検証と一貫して結び付けられないため、価値が限られています。

他のヒント

public class SalesCommissionValidation : CodeActivity<decimal>
{
    public decimal NetSales { get; set; }
    public decimal Percentage { get; set; }

    protected override decimal Execute(CodeActivityContext context)
    {
        var commission = NetSales * (Percentage / 100);
        return commission;
    }

    protected override void CacheMetadata(CodeActivityMetadata metadata)
    {
        base.CacheMetadata(metadata);

        if (NetSales <= 0)
            metadata.AddValidationError("Sales cannot be less than 0!");
        else if (Percentage <= 0)
            metadata.AddValidationError("Sales percentgage cannot be less than 0!");
        else
        {
            if (Percentage > 20)
                metadata.AddValidationError(string.Format("Sales percentgage {0} cannot be greater than 20%", Percentage));
        }

    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top