WPF - 将属性设置为自身无法触发已更改的事件

时间:2014-10-28 09:25:13

标签: c# wpf mvvm properties inotifypropertychanged

这是一种奇怪的行为。我们最近在WPF MVVM应用程序中构建了一些看起来像这样的代码:

foreach (var mA in Preferences.Where(itm => itm.Preference == "Y"))
{
    Member m = _members.FirstOrDefault(itm => itm.MemberID == mA.MemberAvertedID);
    if (m != null)
    {
        m.Selected = true;
    }
}

Members = _members;

因此,FirstOrDefault获取对更新的成员的引用。成员和_成员实际上是相同的 - 前者是一个属性,将后者包装为私有变量,并触发事件:

public ObservableCollection<Member> Members
{
    get
    {return _members;}

    set
    {
            _members = value;
            OnPropertyChanged("Members");
    }
}

将成员设置为_成员的目的只是为了让事件发生 - 但它没有成功。当你走过时,OnPropertyChanged事件被触发,但应用程序没有响应。但是,这确实有效:

foreach (var mA in Preferences.Where(itm => itm.Preference == "Y"))
{
    Members m = _members.FirstOrDefault(itm => itm.MemberID == mA.MemberAvertedID);
    if (m != null)
    {
        mtc.Selected = true;
    }
}

var mem = new ObservableCollection<Members>(_members);
Members = mem;

我假设这里发生的事情是因为将成员设置为_成员实际上是属性设置本身,代码&#34;假设&#34;没有任何改变,并跳过事件。但我对这个解释并不满意。任何人都可以进一步阐明这里发生了什么吗?

1 个答案:

答案 0 :(得分:1)

对ObservableCollections的绑定不会重新绑定列表,除非集合引用不同,因此最后一段代码正在工作。也就是说,除非您实际在基础_members列表中添加或删除项目,否则您不必重新绑定整个列表。

所以(我假设)如果您的目标是刷新所选成员的状态,那么您可能缺少OnPropertyChanged("Selected")属性中的Selected

总结:正在更改的属性必须在PropertyChanged事件中命名。事件必须来自拥有该属性的对象。在这种情况下,通知WPF对Selected属性的更改需要在Member实例上引发事件。