7

MVVM パターンを使用するアプリケーションがあり、ユーザーが情報を入力するときに検証を実装したいと考えています。

IDataErrorInfo を使用したいのですが、ビュー モデルでそのインターフェイスを実装するのが良い考えなのか、それとも新しいクラスを作成した方がよいのかわかりません。IDataErrorInfo と MVVM パターンで検証を実装する最良の方法は?

編集:いくつかの例では、実装がモデルにあることがわかります(ビューモデルと同じではありません)が、私の場合、モデルは基本的に、edmxモデルを作成するときにデータベースから作成するPOCOエンティティですエンティティ フレームワークなので、モデルを更新する必要がない場合は作業をやり直す必要があるため、このエンティティを変更する必要は避けたいと思います。

ありがとう。

4

4 に答える 4

2

この件に関するコメントの大多数に同意しますが、このインターフェースへの「アップグレード」を提供するために回答しています。

このインターフェイスの問題点はIDataErrorInfo、一度に 1 つのエラーしか対処できないことです。BaseDataTypeしたがって、クラス (すべてのデータ型の基本クラス)に追加のフィールドを追加しました。

protected ObservableCollection<string> errors = new ObservableCollection<string>();

次に、次のプロパティを追加しました。

// this just enables me to add into the error collection from outside this class
public ObservableCollection<string> ExternalErrors
{
    get { return externalErrors; }
}

public override ObservableCollection<string> Errors
{
    get
    {
        errors = new ObservableCollection<string>();
        // add properties to validate
        errors.AddUniqueIfNotEmpty(this["Property1ToValidate"]);
        errors.AddUniqueIfNotEmpty(this["Property2ToValidate"]);
        errors.AddUniqueIfNotEmpty(this["Property3ToValidate"]);
        // add external errors (from view models)
        errors.AddRange(ExternalErrors);
        return errors;
    }
}

public virtual bool HasError
{
    get { return Errors != null && Errors.Count > 0; }
}

このAddUniqueIfNotEmptyメソッドは拡張メソッドであり、それが何をするかはすべて推測できると思います。

これを使用して、ビュー内のエラーのコレクションに直接バインドできます。コレクションが空のときにエラーを表示するコントロールを非表示にするために、HasErrorを使用してプロパティにバインドすることもできます。BoolToVisibilityConverter

于 2013-07-23T16:32:04.517 に答える
2

検証ロジックを UI から分離することは常に良い考えです。このように、IDataErrorInfo を使用することは正しいです。

ビュー モデルとモデルの間では、このインターフェイスが UI によって使用されるため、ビュー モデルに IDataErrorInfo を実装することを好みます。テスト コードで直接インデクサーを呼び出して UI をシミュレートできますが、ビジネス ロジック層で検証ロジックが本当に必要な場合、そのような呼び出しはあまり意味がありません。

私たちのプロジェクトでは、検証はより独立したコンポーネントであり、構成によってプレゼンテーション層とビジネス ロジック層の両方で使用できます。ビュー モデルの観点から見ると、それは非常に薄く、呼び出しのみを含み、インデクサー内で検証結果を構築します。

また、もう 1 つの考慮事項は、.Net 4.5 および Silverlight によって提供される INotifyDataErrorInfo です。.Net 4.5 への更新を計画した後で、1 つのプロパティと時間のかかる検証の非同期検証からより多くの検証結果が得られます。

それがあなたを助けることを願っています。

于 2013-07-23T15:42:56.917 に答える
1
<TextBox Text="{Binding Path=MyCoolProperty, ValidationOnDataErrors=true}"

多分私は何かを見逃していますが、このようなバインディングがある場合 - "MyCoolProperty" を持つクラスは INotifyPropertyChanges と IDataErrorInfo を実装する必要があります - そうでなければ機能しません。

したがって、質問は「IDataErrorInfoを実装する必要があります」ではなく、おそらくIDataErrorInfoを実装する方法だと思います

于 2013-07-25T05:56:09.050 に答える