項目が変更されたときに ObservableCollection に通知する方法
.NET の ObservableCollection クラスは、コレクションへの変更を追跡する手段を提供します。またはアイテムを削除します。ただし、コレクション内の項目のプロパティへの変更は自動的に検出されません。
この問題に対処するために、質問で言及されている TrulyObservableCollection などのカスタム実装が存在します。このクラスは ObservableCollection を拡張し、コレクションに追加またはコレクションから削除された項目のイベント ハンドラーを追加します。また、個々の項目のプロパティの変更も追跡します。
実装と使用法
TrulyObservableCollection を使用するには、まずインスタンスを作成し、それに項目を設定します。
public class MyViewModel { public TrulyObservableCollection<MyType> MyItemsSource { get; set; } public MyViewModel() { MyItemsSource = new TrulyObservableCollection<MyType>(); MyItemsSource.Add(new MyType() { MyProperty = false }); MyItemsSource.Add(new MyType() { MyProperty = true }); MyItemsSource.Add(new MyType() { MyProperty = false }); } }
ただし、TrulyObservableCollection の実装により Reset イベントが発生しますアイテムのプロパティが変更されるたびに、コレクション全体に対して。これはパフォーマンスに影響を与える可能性があり、望ましい動作ではない可能性があります。
代替アプローチ
代替アプローチは、コレクション内の各項目のプロパティ変更イベント ハンドラーを直接登録することです。 :
public class MyViewModel { public ObservableCollection<MyType> MyItemsSource { get; set; } public MyViewModel() { MyItemsSource = new ObservableCollection<MyType>(); MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged; MyItemsSource.Add(new MyType() { MyProperty = false }); MyItemsSource.Add(new MyType() { MyProperty = true }); MyItemsSource.Add(new MyType() { MyProperty = false }); } private void MyItemsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.NewItems != null) foreach (MyType item in e.NewItems) item.PropertyChanged += MyType_PropertyChanged; if (e.OldItems != null) foreach (MyType item in e.OldItems) item.PropertyChanged -= MyType_PropertyChanged; } private void MyType_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "MyProperty") DoWork(); // Perform desired action } }
アイテムがコレクションに追加またはコレクションから削除されるときにのみプロパティ変更イベント ハンドラーを登録することで、このアプローチはアイテムのプロパティ変更をよりターゲットにします。パフォーマンスのオーバーヘッドを回避しながら効果的に。
以上が項目プロパティの変更を ObservableCollection に効率的に通知するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。