ホームページ >バックエンド開発 >C++ >それ自体とその要素の両方の変更を監視するコレクションは存在しますか?

それ自体とその要素の両方の変更を監視するコレクションは存在しますか?

DDD
DDDオリジナル
2025-01-07 16:27:41928ブラウズ

Does a Collection Exist That Monitors Changes in Both Itself and Its Elements?

監視要素の変更のコレクション

この記事では、コレクション自体とコレクション要素の変更を監視する概念について説明します。通常、ObservableCollection はコレクション自体への変更を通知しますが、その要素への変更は通知しません。

要素の変更を監視できる既存のコレクションはありますか?

はい、この要件を満たすために ObservableCollection を拡張するカスタム実装を作成できます。

要素監視機能を備えたカスタム ObservableCollection:

これは変更された ObservableCollection バージョンです:

<code class="language-csharp">public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged
{
    // 订阅添加到项目中的 PropertyChanged 事件
    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        Subscribe(e.NewItems);
        base.OnCollectionChanged(e);
    }

    // 取消订阅从移除的项目中移除的 PropertyChanged 事件,并在清除集合时清除所有项目
    protected override void ClearItems()
    {
        foreach (T element in this)
            element.PropertyChanged -= ContainedElementChanged;
        base.ClearItems();
    }

    // 订阅元素中的 PropertyChanged 事件
    private void Subscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged += ContainedElementChanged;
        }
    }

    // 取消订阅元素中的 PropertyChanged 事件
    private void Unsubscribe(IList iList)
    {
        if (iList != null)
        {
            foreach (T element in iList)
                element.PropertyChanged -= ContainedElementChanged;
        }
    }

    // 当包含的元素属性更改时发出通知
    private void ContainedElementChanged(object sender, PropertyChangedEventArgs e)
    {
        OnPropertyChanged(e);
    }
}</code>

このカスタム コレクションを使用します:

<code class="language-csharp">ObservableCollectionEx<Element> collection = new ObservableCollectionEx<Element>();
((INotifyPropertyChanged)collection).PropertyChanged += (x, y) => ReactToChange();</code>

PropertyChanged イベント使用時の注意:

カスタム コレクションで PropertyChanged イベントを使用する場合、送信者は変更された要素ではなく、コレクション自体になることに注意してください。必要に応じて、より明示的な通知のために別の ContainerElementChanged イベントを定義できます。

以上がそれ自体とその要素の両方の変更を監視するコレクションは存在しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。