コレクションと要素の属性の変更を監視する ObservableCollection
質問:
コレクション自体の変更とその要素の属性の変更を同時に監視できるコレクションはありますか?
解決策:
この要件を満たす既製のコレクションがない場合は、ObservableCollection
を拡張してその要素の PropertyChanged
イベントを監視する実装を作成できます。
実装:
次に、この機能を実装する ObservableCollectionEx
の実装例を示します。
<code class="language-csharp">public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged { protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { Unsubscribe(e.OldItems); Subscribe(e.NewItems); base.OnCollectionChanged(e); } protected override void ClearItems() { foreach (T element in this) element.PropertyChanged -= ContainedElementChanged; base.ClearItems(); } private void Subscribe(IList iList) { if (iList != null) { foreach (T element in iList) element.PropertyChanged += ContainedElementChanged; } } private void Unsubscribe(IList iList) { if (iList != null) { foreach (T element in iList) element.PropertyChanged -= ContainedElementChanged; } } private void ContainedElementChanged(object sender, PropertyChangedEventArgs e) { OnPropertyChanged(new PropertyChangedEventArgs(e.PropertyName)); //Corrected this line. } }</code>
使用法:
を通常の ObservableCollection
と同様に使用しますが、要素のプロパティ変更イベントをサブスクライブするには、ObservableCollectionEx
に変換します。 INotifyPropertyChanged
<code class="language-csharp">ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>(); ((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>
注: メソッドでは、ContainedElementChanged
のパラメーターは OnPropertyChanged
を直接使用するのではなく、新しい PropertyChangedEventArgs
インスタンスである必要があります。 これは上記のコードで修正されています。 これにより、正しいプロパティ名がイベント ハンドラーに確実に渡されます。 e
以上がコレクションと要素のプロパティの変更の両方を追跡する ObservableCollection は存在しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。