2009-07-16 8 views
6

WPFのObservableCollectionには、リストの項目を追加または削除するだけでGUIの変更が反映されていますが、編集することはできません。アイテムの変更時にObservableCollectionが更新されないのはなぜですか?

つまり、カスタムクラスMyObservableCollectionを書き込む必要があります。 この動作の理由は何ですか?これらのオブジェクトは、その後、変更されたとき、あなたが通知されるようにしたい場合は、で観測可能としても(例えば、これらのオブジェクトを作成する必要があります -

おかげ

答えて

11

のObservableCollectionは、あなたがそれに含まれるオブジェクトに変更を加えるかどうかを知る方法がありませんこれらのオブジェクトを持つオブジェクトがINotifyPropertyChangedを実装する)

+0

OK。私はINotifyPorpertyChangedインターフェイスを実装します。ありがとう –

0

おそらく、アイテムは編集時にコレクションに警告する方法がないため、観察できない可能性があります。他のクラスも同様の動作をします。参照されるクラスのグラフ内のすべての変更を警告する方法はありません。

0

回避策として、コレクションからオブジェクトを抽出し、処理が完了した後にオブジェクトを挿入することができます。要件や並行性モデルによっては、プログラムを醜いものにすることもできます。これは速いハックであり、品質を必要とするものには適していません。

代わりに、特にContentChanged(名前についてはわからない)イベントをトリガーするupdateメソッドを使用してコレクションを実装できます。それはかなりではありませんが、対処するのは少なくともかなり簡単です。

理想的には、kragen2ukによれば、オブジェクトを監視可能にし、クライアントコードをきれいでシンプルに保つことが理想的です。

も参照してください。this questionを参照してください。

+0

抽出と再挿入は本当に素敵なハックです:)今、私はこのトリックを忘れなければならないことを知っています:) –

1

これを達成する別の方法は、DependencyObjectから派生した新しいXXXViewModelクラスを実装し、これをObservableCollectionに配置することです。この非常に良いMVVMの導入で、この外観のため

http://blog.lab49.com/archives/2650

は、そのようなクラスの例は次のようになります。ここ

public class EntryViewModel : DependencyObject 
{ 
    private Entry _entry; 
    public EntryViewModel(Entry e) 
    { 
     _entry = e; 
     SetProperties(e); 
    } 

    private void SetProperties(Entry value) 
    { 

     this.Id = value.Id; 
     this.Title = value.Title; 
     this.CreationTimestamp = value.CreationTimestamp; 
     this.LastUpdateTimestamp = value.LastUpdateTimestamp; 
     this.Flag = value.Flag; 
     this.Body = value.Body; 
    } 


    public Entry Entry 
    { 
     get { 
      SyncBackProperties(); 
      return this._entry; 
     } 
    } 


    public Int64 Id 
    { 
     get { return (Int64)GetValue(IdProperty); } 
     set { SetValue(IdProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for Id. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty IdProperty = 
     DependencyProperty.Register("Id", typeof(Int64), typeof(EntryViewModel), new UIPropertyMetadata(new Int64())); 

}} 

重要な事柄: - それはのDependencyObject から派生した - それはで動作しますWPFデータバインディングをサポートするDependencyProperties

br sargola

+0

興味深いですが、私はどのような目的のためにDependencyObjectから継承していますか?クラス内のWPFにバインドされた依存関係のプロパティは十分でなければなりません..または? –

+0

@ PaN1C_Showt1Me:GetValue/SetValueがそこに実装されています。 br Sargola – Sargola

+0

ああok .. UserControlもDependencyObjectです。気づいていませんでした。ありがとう –

1

データ・モデル・オブジェクトのPropertyChangedイベントをビュー・モデル・クラスに登録し、データ・オブジェクトのプロパティの変更が発生したときにViewモデルでそのメソッドを聴くことができます。これは、観察可能なコレクションの項目が変更されたときに、Viewモデルで制御することは非常に簡単で、直接的な方法です。これが役立つことを願って...

関連する問題