首页 >后端开发 >C++ >为什么当项目的属性更改时,我的观察力计算不更新?

为什么当项目的属性更改时,我的观察力计算不更新?

DDD
DDD原创
2025-01-29 13:26:09979浏览

Why Doesn't My ObservableCollection Update When an Item's Property Changes?

ObservableCollection 的项目属性更改问题

在提供的代码中,当项目属性 (IsRowChecked) 更改时,ObservableCollection (ContentList) 不会收到通知。这导致调试器不会在所需位置停止。

原因

问题在于 ObservableCollection 追踪更改的方式。它只监视集合本身的更改,例如添加或删除项目。默认情况下,不会注册单个项目属性的更改。

解决方案

要解决此问题,您可以使用监视其项目属性更改的自定义 ObservableCollection 实现。这是一个使用名为 TrulyObservableCollection 的自定义类的解决方案:

<code class="language-csharp">public sealed class TrulyObservableCollection<T> : ObservableCollection<T>
    where T : INotifyPropertyChanged
{
    // 为简洁起见,省略构造函数和其他样板代码

    private void FullObservableCollectionCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        // 订阅新项目的 PropertyChanged 事件
        if (e.NewItems != null)
        {
            foreach (Object item in e.NewItems)
            {
                ((INotifyPropertyChanged)item).PropertyChanged += ItemPropertyChanged;
            }
        }

        // 取消订阅已删除项目的 PropertyChanged 事件
        if (e.OldItems != null)
        {
            foreach (Object item in e.OldItems)
            {
                ((INotifyPropertyChanged)item).PropertyChanged -= ItemPropertyChanged;
            }
        }
    }

    private void ItemPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        // 通知集合项目已更改
        NotifyCollectionChangedEventArgs args = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, sender, sender, IndexOf((T)sender));
        OnCollectionChanged(args);
    }
}</code>

通过使用 TrulyObservableCollection,您的 ObservableCollection 将在项目属性更改时收到通知,允许您在视图模型中做出相应的反应。

以上是为什么当项目的属性更改时,我的观察力计算不更新?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn