3

List<Person> collectionDataGridコントロールのItemsSourceとしてを使用しました。

ただし、リストコレクションからアイテムを削除しても、ビューは更新されませんでした。私は解決のために長い間苦労していました。

List<Person>次に、ViewModelのコレクションの代わりに。これをに変更しましたObservableCollection<Person> collection。これで、コレクションに変更があるたびにビューが更新されます。

なぜ更新されるのかわかりませんかObservableCollection<Person>?誰 ?

4

4 に答える 4

5

その名のとおりです。単純なリストは、UIに更新を指示しません。つまり、「ビューはリストを監視できません」。データバインディングの背後に奇妙な魔法はありません。WPFとDataBindingは、「これは新しい」または「これは変更された」ことを伝えるためにデータモデルを必要とします。おそらく、すでにINotifyPropertyChangedを見ました。INotifyCollectionChangedは同じですが、コレクションの場合、List<>それを実装していません。ObservableCollectionは実装しています。

于 2012-05-15T10:00:34.003 に答える
1

ObservableCollection<T>コレクション内のアイテムを変更するたびに変更イベントを発生させます。List<T>そうではありません。それが理由。

DataBindingは怠惰です。何かが変更されたことを自分の見解に伝えなければ、わざわざ更新することはありません。内部的には、WPF DataBindingが変更通知を登録するため、ViewModelはビューが変更されたときにビューに通知できます。とのようなインターフェースでこれを行いINotifyPropertyChangedますINotifyCollectionChanged

ObservableCollection<T>インターフェイスを実装しますINotifyCollectionChanged。このインターフェースは、CollectionChangedビューが基本的に独自のイベントハンドラーをアタッチするイベントを定義します。そのハンドラーは、コレクションによってイベントが発生したときにビューを更新します。

于 2012-05-15T10:00:45.223 に答える
1

ListはINotifyCollectionChangedを実装していないため

于 2012-05-15T10:01:15.067 に答える
1

データバインディングの更新は一種の魔法ではないため、データバインディングを正しく機能させるにはいくつかの要件があります。このプロパティにバインドする単一のプロパティがある場合は、依存関係プロパティであるか、その親クラスがINotifyPropertyChangedインターフェイスを実装して、プロパティ値の変更についてwpfバインディングシステムに通知する必要があります。コレクションには、同様のメカニズムがあります。削除/移動/追加されたアイテムについてwpfバインディングシステムに通知するために、INotifyPropertyChangedを実装する必要があります。

詳細については、こちらを参照してください:http: //msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged.aspx

于 2012-05-15T10:02:51.053 に答える