2011-01-13 12 views
2

だから私はだからここにこのクラス/構造体のすべてのメンバーに対してINotifyPropertyChangedを発生させますか?

Class Dataclass 
{ 
    var data 
    var data; 
    var data; 
} 

class DataViewModel 
{ 
    private Dataclass thing; 

    public string thingPropertyName = "thing"; 
    public Dataclass Thing 
    { 
    get { return thing; } 
    set { thing = value; RaisedPropertyChanged(thingPropertyName);} 
    } 
} 

ようにセットアップされたプロジェクトは私の問題である持っている:私は私のModelViewクラスでシングフィールドを経由してサブプロパティにバインドする場合のいずれかの場合、バインディングは更新されません。クラスのメンバーは、オブジェクト全体が変更された場合にのみ変更されます。私が意図していると考えているものです。

これを回避するにはどうしたらよいですか?含まれているDataclassのメンバーに何かを行えば、私のバインディングは正しく更新されますか?

私はそうのように、親クラスのプロパティにサブクラスのすべての要素をラップした見てのだ最初の事:この作品

public var Data 
{ 
    get { return thing.Data; } 
    set { thing.Data = value; RaisePropertyChanged(DataProperyName);} 
} 

、しかし、私はまだ問題がある場合、サブクラスオブジェクトが初期化されます。私が見ることができる唯一の解決策は、クラスが初期化されたときに各要素のRaisedPropertyName()を手動で呼び出すことです。これは最適な方法ではないようです。私はもっ​​と良いアプローチがあることを期待していました。ありがとう。

+0

素敵なアバター(他人のことを思い出させます):) –

答えて

3

DataClassのプロパティにバインドしていてバインディングをリフレッシュしたい場合(最終的にはバインディングを使用することが目標です)、DataClassにINotifyPropertyChanged(その目的はまったく同じ)を実装する必要があります。

"レイヤー"の理由でDataClassにINotifyPropertyChangedを実装させたくない場合(例:Dataクラスでビューに関連する問題を実装したくない場合)、DataViewModelはパススルーとして機能する必要がありますあなたが必要とする各プロパティ。これが提案する第2の解決策です。

4

ほとんどの場合、RaisePropertyChanged(null)(args構造体のプロパティ名パラメータとしてnullを持つ適切なINotifyPropertyChangedイベントデリゲートへの呼び出しを最終的に呼び出すと仮定します)は、すべてのバインドされたリスナーに更新を指示します。

+0

ありがとう、私はINotifyPropertyChangedがこのように機能することに気づいていませんでした。 – Brandorf

+0

@Brandorf、すべてのリスナーが正しくnullを解釈するわけではないので、それは保証されていません。 WPFコンテキストではDependencyPropertyバインディングで確実に動作しますが、他のクライアントはNotifyPropertyChangedにサブスクライブし、nullを正しく処理できません。 –

関連する問題