2009-12-01 16 views
6

WF 4.0のカスタムアクティビティ/カスタムアクティビティファクトリ/カスタムデザイナで、いつどのように検証する必要があるのか​​不明です。Workflow Foundation 4.0の設計時検証のパターンは何ですか?

アクティビティ内で妥当性検査エラーをサポートすると思われる唯一の場所は、CacheMetadataメソッドです(これは設計プロセス中に複数回呼び出されると思います)。私はここで私の検証をしなければならないのですか? ActivityDesigner内での検証のサポートはありますか?

+0

視聴者にとって、WPFでは常にうまく機能するとは限りません。私は最終的に、基本クラス(NativeActivityを拡張)が実装からの検証エラーを集め、CacheMetadata呼び出しとIDataErrorInfoの両方でこれらを使用するハイブリッドシステムを作成しました。 – Will

答えて

3

はい、アクティビティの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プロパティを定義することもできます。しかし、それは余分な作業であり、ランタイム検証と一貫して結びつくことはないので、それは限られた価値観です。

-1
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)); 
     } 

    } 
} 
+0

回答には、コードの説明と問題の解決方法の説明が含まれている必要があります。 – AbcAeffchen

関連する問題