1

私はいくつかのクラスを書いていますが、INotifyPropertyChangedを実装することで、それらすべてを「データバインディングに準拠」(WPF、またはおそらくよりまれなWinFormsの場合)にしたいです。

問題は繰り返されるコードです。私は実際に同じ方法を何度もコピーアンドペーストします(冗談ではありません)。

protected void OnPropertyChanged([CallerMemberName] String propertyName = null)
{
    if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

私はしばらくの間この問題を抱えていましたが、今日は特にそれが何度も何度も発生し続けているので、あなたが解決策を手伝ってくれることを願っています。このメソッドを持つクラスはほぼ12ありますが、そのコードを繰り返すのは本当に嫌です。

私はそれを実装する基本クラスを作成することを考えました(NotifyPropertyChangedObjectおそらく名前のために)が、それはおそらく多重継承なしで私のクラスを本当に制限する悪い考えです。
拡張メソッドも考えましたが、スコープをメソッドとしてスコープしたいprotectedので、どちらも機能しません。

この問題を解決するために何ができるでしょうか?

4

3 に答える 3

3

基本クラスを持つことは、MVVMヘルパーライブラリでさえ行う方法です。それには欠点はありません。

はい、ac#クラスの基本クラスは1つだけですが、複数のインターフェイスを実装する必要があります。あなたの場合、あなたがしなければならないのは、基本クラスにINPCを実装させ、それを呼び出すことだけです。ViewModelBase

現在、クラスがクラスXから継承している場合はA、Aをから継承させるだけViewModelBaseです。

したがって、現在の基本クラスをこの新しいINPC提供クラスから継承するようにし、派生クラスのいずれにもINPC実装のコード重複がないようにします。

アップデート

何らかの理由ですでに別の基本クラスを持っていることに結びついていて、メンバー変数としてこのオブジェクトに渡されるINPCのパブリック実装のようなことを言わないという制限がある特別な場合では、

あなたはこれを見てみることができます:

Fody、特にアドオンPropertyChanged-アドオン

これは、INPC実装自体を挿入するため、うまくいけば役立ちます。したがって、コピーアンドペーストコードを必要とせず、カスタム基本クラスから派生することもできます(INPCを指定する必要がありますが、ここでは単なるインターフェイスです)

于 2013-03-26T11:51:06.450 に答える
0

私は通常、ビューをビューモデルタイプのオブジェクト、つまりビューに必要なすべてのデータを含むオブジェクトにバインドします。これにより、ビューは1つのオブジェクトにのみバインドする必要があるため、システムの作業が容易になります。

次に、通常、ビジネスオブジェクトにデータをビューモデルに公開させ、単一のイベントを公開して、ビューモデルに状態が変更されたことを通知します。その時点で、ビューモデルは関連するプロパティ固有の通知をビューに呼び出します。つまり、ビュー/ビューモデルごとに1回だけ上記のメソッドを実装する必要があります。

MVVMモデルをまだ調べていない場合は、調べてください。上記は無数のアプローチの1つに過ぎず、実際、一部の人が同意しない可能性があり、特定のシナリオに適合する場合と適合しない場合がある私の解釈です。

于 2013-03-26T11:51:56.237 に答える
0

@vivによる回答に追加します。Fody + PropertyChangedを使用することをすでに決定している場合は、基本クラスを避けることをお勧めします。PropertyChangedはすべてのINPC実装を実行するため、基本クラスを持つことにはほとんど価値がありません。実際、価値よりも多くの痛みがあります。クラスに属性を追加するだけPropertyChanged.ImplementPropertyChangedで、残りは自動的に行われます。

[ImplementPropertyChanged]
public class Person 
{
    public string Name { get; set; }
}

所有していないため、INPCを実装するように作成できるクラスについて。最善のアプローチは、バインドする各クラスの簡略化されたバージョンを表す複製クラスを作成することです。ビューをロードして終了するときに、値の読み取りと書き込みを行うことができます。または、特定のプロパティのみにバインドする場合は、これらのプロパティをメインビューモデルに配置するだけです。

于 2013-03-30T00:18:49.237 に答える