4

WPF アプリケーションに IDataErrorInfo を実装する最善の方法を見つけようとして問題が発生しています。いくつかのモデルがあり、それぞれが多くのプロパティを持ち、使用されています。ViewModel にはこれらの各モデルのプロパティがあり、View はこれらのプロパティを使用してモデルにバインドします。これは私が持っている構造の縮小版です:

public class ModelA
{
    public string PropertyA1 {get; set;}
    public string PropertyA2 {get; set;}
}

public class ModelB
{
    public string Property B1 {get; set;}
    public string Property B2 {get; set;}
}

public class ViewModel
{
    public ModelA modelA {get; set;}
    public ModelB modelB {get; set;}
}

私の質問は - IDataErrorInfo をどこに実装すればよいですか - ViewModel またはモデル内ですか? View はこれらのプロパティに modelA.PropertyA1 などとしてバインドされるため、ViewModel ではなくモデルでエラーが発生するため、モデルで IDataErrorInfo を実装する必要があります。ただし、ViewModel に検証ロジックを実装することをお勧めします。

たくさんのプロパティがあり、それぞれのラッパーを書くのは面倒なので、エラーを発生させる各プロパティのラッパーを書かずに ViewModel でエラーをキャッチする方法があるかどうか疑問に思っていました。

ご協力いただきありがとうございます!

4

3 に答える 3

2

IDataErrorInfoビューモデルで実装する必要があると思います。ビューモデルの基本クラスがあり、おそらくそうするべきである場合は、そこに実装できます。これで、実装/検証ロジックはすべて基本クラスにあり、n個のビューモデルに分散されません。

于 2013-01-11T16:02:17.697 に答える
1

モデルのプロパティのValaidationが必要な場合、これは、Baseクラスに実装されている場合、またはモデル内の各モデルに対して実装されている場合にのみ実行できます。ViewModelでModelAを検証する場合は、ViewModelで実装する必要がありますが、A1の検証を実装する場合は、ModelAで実装する必要があります。

modelAのインスタンスを変更すると、IDataViewModelはクラスに入り、(ViewModelのインスタンス)["modelA"]を呼び出そうとします。OKですが、これは必要なことではありません。modelAIDataViewModelがmodelAのインスタンスに入り、modelA ["B1"]を呼び出し、ViewModelで検証を実装している場合、modelAは空の文字列を再実行します。

于 2013-01-11T16:07:54.153 に答える
0

助けてくれてありがとう!問題を解決することにした方法は次のとおりです。

2つの基本クラスを作成しました。1つは通常のモデル(検証がないモデル。INotifyPropertyChangedのみを実装します)用で、もう1つは検証があるモデル用です。

public abstract class ModelBase : INotifyPropertyChanged
{
    //Implement INotifyPropertyChanged here
}

public delegate string ValidateProperty(string propertyName);

public abstract class ValidationModelBase : ModelBase, IDataErrorInfo
{
    private bool _canValidate;
    public bool CanValidate
    {
        get { return _canValidate; }
        set { _canValidate = value; }
    }

    #region IDataErrorInfo Members

    public string Error
    {
        get { return string.Empty; }
    }

    public string this[string columnName]
    {
        get
        {
            if (this.CanValidate)
            {
                return this.Validate(columnName);
            }
            return string.Empty;
        }
    }

    #endregion

    #region Validation Section

    public event ValidateProperty OnValidateProperty;

    public string Validate(string propertyName)
    {
        if (this.OnValidateProperty != null)
        {
            return OnValidateProperty(propertyName);
        }
        return string.Empty;
    }

    #endregion
}

今、私のモデルは次のようになりました:

public class ModelA : validationModelBase
{
    public string PropertyA1 {get; set;}
    public string PropertyA2 {get; set;}
}

public class ModelB : ValidationModelBase
{
    public string Property B1 {get; set;}
    public string Property B2 {get; set;}
}

大きな変化はありません。ViewModelは次のようになります。

public class ViewModel
{
    public ModelA modelA {get; set;}
    public ModelB modelB {get; set;}

    public ViewModel()
    {
        this.modelA.OnValidateProperty += new ValidateProperty(ValidateModelA);
        this.modelB.OnValidateProperty += new ValidateProperty(ValidateModelB);
    }

    private string ValidateModelA(string propertyName)
    {
        //Implement validation logic for ModelA here
    }    

    private string ValidateModelB(string propertyName)
    {
        //Implement validation logic for ModelB here
    }
}

これは今のところ私のために働いているようです。このように、検証を行う新しいモデルは、ValidationModelBaseから派生し、ViewModelに検証イベントのイベントハンドラーを追加するだけで済みます。

誰かが私の問題を解決するためのより良い方法を持っているなら、私に知らせてください-私は提案と改善を受け入れています。

于 2013-01-11T18:02:08.253 に答える