如何在ObservableCollection中的任何项目上更改某个字段时收到通知?

时间:2012-06-20 13:35:46

标签: c# windows-phone-7 observablecollection propertychanged

public ObservableCollection<Activity> activities = 
    new ObservableCollection<Activity> { };

public class Activity{
    public ObservableCollection<Event> Events { get; set; }
}

public class Event : INotifyPropertyChanged
{
    private int _Status;
    public int Status
    {
        get { return _Status; }
        set 
        {
            _Status = value;
            OnPropertyChanged("Status");
        } 
    }
}

假设Status的{​​{1}}属性已更改。 Event会被调用,对吧?

但我希望系列OnPropertyChanged("Status")也会收到有关此activities更改的通知。

有办法吗?

尝试恢复: 以上描述了该场景。 想象一下某些事件的一些变化。 我需要收集活动,其中包含此事件的父活动,通知有关此更改...所以我可以调用一个方法来更新在我的界面的某个地方显示的事件。并且在此界面中只显示活动集合。

正因为如此,还必须通知收集。

3 个答案:

答案 0 :(得分:0)

你没有 - .net集合不关心它们中项目的变化,只关心集合中的变化。

无论是谁收听集合中的事件,都必须对他感兴趣的项目订阅/取消下载PropertyChanged。

答案 1 :(得分:0)

这是一种痛苦,没有任何内置可以为你做到这一点。

当我需要这样做时,我只是订阅了ObservableCollection的CollectionChanged事件,并手动管理我对订阅项的PropertyChanged事件的订阅和取消订阅。请注意,取消订阅已删除的项目非常重要!否则,您的事件订阅可以让您自己遇到麻烦,停止对已删除项目的垃圾回收。

我认为可以构建一个包装器或您自己的集合类,它将围绕一个集合并调解添加/删除,以便订阅/取消订阅属性更改事件。这似乎不值得努力。

至于为什么要这样做,最基本的例子是你有一组可变项,你需要知道这个集是否脏/需要保存。如果您的保存操作在整个设置上运行,那么必须观看所有项目感觉是错误的。我确信,还有其他原因可以解释为什么这样看起来更清晰。

答案 2 :(得分:0)

我解决了这个问题,只是创建了一个静态动作:

public class Event{
    public static Action OnChanged;
}

基本上,每当我需要根据某些事件变化进行一些更改时,我都会这样称呼。

    private StatusMode _Status;
    [DataMember(Name = "Status")]
    public StatusMode Status
    {
        get { return _Status; }
        set 
        {
            _Status = value;
            OnPropertyChanged("Status");
            if (OnChanged != null)
            {
                OnChanged();
            }
        } 
    }

使用:

Event.OnChanged = UpdateContent;

public void UpdateContent()
{
//do something
}