アイテムの変更時に ObservableCollection に通知する
ObservableCollection は、INotifyCollectionChanged インターフェイスを実装する便利なコレクション タイプで、コレクション内の変更をリッスンできます。 。ただし、ObservableCollection は、コレクション内の項目のプロパティに加えられた変更については通知しません。
制限の克服
この制限に対処するには、カスタム ObservableCollection を実装できます。 TrulyObservableCollection と呼ばれる、ObservableCollection から継承し、CollectionChanged イベント ハンドラーをオーバーライドしてサブスクライブし、コレクションに追加またはコレクションから削除された項目の PropertyChanged イベントのサブスクライブを解除します。
TrulyObservableCollection
public class TrulyObservableCollection<T> : ObservableCollection<T> where T : INotifyPropertyChanged { public TrulyObservableCollection() : base() { CollectionChanged += TrulyObservableCollection_CollectionChanged; } void TrulyObservableCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.NewItems != null) { foreach (Object item in e.NewItems) { (item as INotifyPropertyChanged).PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged); } } if (e.OldItems != null) { foreach (Object item in e.OldItems) { (item as INotifyPropertyChanged).PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged); } } } void item_PropertyChanged(object sender, PropertyChangedEventArgs e) { NotifyCollectionChangedEventArgs a = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset); OnCollectionChanged(a); } }
使用法
TrulyObservableCollection を使用します。ObservableCollection を次のように置き換えるだけです。コード内のTrulyObservableCollection。変更を処理するには、コレクションの CollectionChanged イベントにハンドラーをアタッチする必要があります。
MyItemsSource = new TrulyObservableCollection<MyType>(); MyItemsSource.CollectionChanged += MyItemsSource_CollectionChanged;
CollectionChanged イベント ハンドラー内で、コレクションに追加またはコレクションから削除された項目の PropertyChanged イベントをサブスクライブしたり、サブスクライブ解除したりできます。
void MyItemsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.NewItems != null) foreach (MyType item in e.NewItems) item.PropertyChanged += new PropertyChangedEventHandler(MyType_PropertyChanged); if (e.OldItems != null) foreach (MyType item in e.OldItems) item.PropertyChanged -= new PropertyChangedEventHandler(MyType_PropertyChanged); }
代替アプローチ
TrulyObservableCollection を使用すると、コレクション変更通知を強制できますが、これは最適なアプローチではない可能性があります。より一般的なパターンは、ObservableCollection の CollectionChanged ハンドラー内で個々の項目の PropertyChanged イベントを処理することです。これにより、コレクション内の特定のプロパティの変更のみが UI の更新を引き起こすようになり、パフォーマンスが最適化され、より詳細な制御が可能になります。
以上が項目のプロパティが変更されたときに ObservableCollection に通知させるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。