ObservableCollections和C#中属性的更改

时间:2011-10-31 13:33:20

标签: c# collections observablecollection inotifypropertychanged inotifycollectionchanged

我正在使用我定义的Job类的可观察集合。我已经绑定了一个处理INotifyCollectionChanged事件的方法。 MSDN告诉我INotifyCollectionChanged是“动态更改的监听器,例如添加和删除项目或刷新整个列表时”,但我想监听任何作业类的属性更改在集合中,是否有一个事件处理程序?我知道有一个INotifyPropertyChanged界面,但我希望这可以用于集合。

编辑:

说实话我很困惑,所以我应该给我正在做的事情提供更多背景信息,这样我才能得到答案。我在“工作”课程中拥有这个属性:

    public Boolean IsPlanned
    {
        get
        {
            return this.Storage<Job>().isPlanned;
        }
        set
        {
            var storage = this.Storage<Job>();

            if (storage.isPlanned != value)
            {
                storage.isPlanned = value;
                this.OnPropertyChanged(() => this.isPlanned);
                MessageBox.Show("IsPlanned property was changed on one of the jobs " + this.Subject);
            }
        }
    }

这个作业类实际上是从telerik控件的约会类继承的(恰好实现了INotifyPropertyChanged)。从telerik文档我也得到了上面的代码(减去消息框)。现在,当我更改此布尔值ONCE时,该消息框行将被执行5次。

任何帮助表示赞赏!!

编辑2:IsPlanned的路径已更改:

PresentationManager.Instance.AllJobs.Single(o => o.JobGuid.Equals(((Job)state.DraggedAppointments.First()).JobGuid)).IsPlanned = true;

PresentationManager.Instance.AllJobs.Single(o => o.JobGuid.Equals(((Job)payload.DraggedAppointments.First()).JobGuid)).IsPlanned = false;

这些都来自不同的类,用于为我的自定义拖放行为(来自列表框)定义覆盖。

2 个答案:

答案 0 :(得分:2)

Job课程上实施INotifyPropertyChanged界面。这样您就可以使用PropertyChanged上的ObservableCollection<Job>

  

完全支持从绑定源对象传输数据值   绑定目标,集合中支持的每个对象   可绑定属性必须实现更改的适当属性   通知机制,例如INotifyPropertyChanged接口。

答案 1 :(得分:0)

这里有一个关于实现ObservableCollection的StackOverflow的例子,它也在修改包含的元素时引发事件:

ObservableCollection that also monitors changes on the elements in collection

请参阅Reed Copseyanswer in this thread以获取指向已隐藏监听其子元素的ObservableCollection的项目的链接。