0

DataGrid を TEntity 型の ObservableCollection にバインドしました。コレクションは、Entity Framework エンティティを保持します。

このようなエンティティが DB で変更されると、アプリに通知されます。単純な置換変更の場合は、ObservableCollection 内のエンティティを上書きするだけです。

ただし、UI の更新はトリガーされません。問題は、私が参照しているオブジェクトがまだ同じであることだと思います。一部の列が変更されたため、エンティティはUIに表示されるものとは明らかに異なります(DbContextでリロードします)。

私がこれをするとき

collection[index] = changedObject;

何も起こりません。コレクションは CollectionChanged イベントを正しく発生させますが、UI は何も更新しません。

それから私はこれを試しました:

collection[index] = new TEntity();  // Create a dummy object
collection[index] = changedObject;

これで UI が更新されますが、コレクションはもちろん 2 つの CollectionChanged イベントを発生させます。

1 つのオプションは、変更されたエンティティのすべてのプロパティに対して PropertyChanged イベントを発生させることだと思いますが、それはやり過ぎ (イベントが多すぎる) と思われ、これまでのところ、EF クラスにイベントを実装する必要はありません。

私の質問:行が変更されたがオブジェクトがまだ同じである場合 (オブジェクト内のプロパティは変更されています)、WPF バインドされた ObservableCollection を確実に更新するにはどうすればよいですか?

4

2 に答える 2

1

プロパティごとに PropertyChanged を使用するか、1 つの PropertyChanged イベントを使用して、オブジェクトのすべてのプロパティが変更されたことを示す必要があります。ドキュメンテーション

于 2014-08-23T23:22:40.330 に答える
0

正解であるChris Laffeyからの回答に追加情報を追加したかっただけです。

さらに読むと、古いオブジェクトと新しいオブジェクトが同じである場合、Replace アクションの CollectionChanged イベントは WPF によって処理されないことが明らかになりました。

WPF の ObservableCollection に EF エンティティを表示していたアプリで、特定の厄介な副作用がありました。

DBの変更を監視していました。テーブルの行が変更されると、エンティティが DbContext から再ロードされました。ObservableCollection は同じ EF エンティティ オブジェクトを (同じメモリ位置で) 使用したため、エンティティが再ロードされると明らかにリセットされる PropertyChanged イベントが上書きされました。

于 2014-08-24T06:39:15.350 に答える