0

そのため、少し検索しましたが、探している答えが見つからないことを認めます。間違ったタグを探している可能性が高いように感じます。

ValidationRuleを実装する検証クラスを介していくつかの検証を適用するテキストボックスを持つビューがあります。私はそれを適切に検証しており、テキストボックスのハイライト/ツールチップが適切に表示されています。

検証が完了したので、Validation.HasError = true の間、[送信] ボタンが有効になるのをブロックできるのではないかと考えました。私の ViewModel は、この ValidationRule を認識していません。また、ValidationRule が false、「何らかのエラー メッセージ」を返したことも知りません。今これを行う適切な方法は何ですか?検証を「モデル」の外に置いて、ValidationRule クラスに残したいと思います。

Validation.HasError が true に設定されている場合、boolean プロパティ「HasValidationError」を作成して true に設定できますか?

4

2 に答える 2

1

ViewModel に検証ロジックを配置し、IDataErrorInfo を使用して UI の検証を処理することをお勧めします。私たちのアプリケーションでは、検証は独立したサービスです。

利点は、ViewModel レベルのエラーとプロパティ レベルのエラーを完全に制御できることです。ViewModel の hasValidationError をすべてのコントロールの ValidationRule に関連付ける方法を見つけたとしても、ViewModel のエラーが実際のロジックではなく UI のみに依存するという潜在的な問題がまだあります。つまり、UI が ViewModel を検証する前に、ViewModel が正しい。

于 2013-06-28T01:55:12.190 に答える
1

Bill Zhang に同意します。MVVM パターンを使用している場合、検証ロジックはビュー モデルに存在する必要があります。理由はたくさんありますが、主な理由は、ビューの検証はテスト可能であるべきであり、ビューよりもビュー モデルをテストする方がはるかに簡単だからです。

説教はここまでにして、コードを見てみましょう。私の記事Zip My Code on CodeProject を参照してください。ここでは、ビュー モデルで検証しています。次のようにバリデーターを登録できます。

class ExcludeItemDialogViewModel : DialogViewModelBase
{
  public ExcludeItemDialogViewModel(string title, string excludeItem)
  {
    AddValidator(() => ExcludedItem, new NotNullOrEmptyValidationRule());

    // Code removed for clarity...
  }

  // Code removed for clarity...
}

メソッド AddValidator を呼び出すと、ビュー モデルの特定のプロパティ (この場合は ExcludedItem) のバリデータが登録されます。検証ルールは次のようになります。

class NotNullOrEmptyValidationRule : IValidationRule
{
  public string ErrorMessage { get; private set; }

  public bool Validate(object value)
  {
    string valueText = value as string;

    if (string.IsNullOrEmpty(valueText))
    {
      ErrorMessage = Resources.NotNullValidationRule_Error;
      return false;
    }

    ErrorMessage = string.Empty;
    return true;
  } 
}
于 2013-06-29T06:35:21.200 に答える