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

本文关键字:事件 属性 设置 WPF- | 更新日期: 2023-09-27 18:28:01

这里有一个奇怪的行为。我们最近在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获取一个对Member的引用,该引用将被更新。Members和_Members实际上是相同的——前者是一个属性,将后者包装为一个私有变量,并带有一个事件火:

public ObservableCollection<Member> Members
{
    get
    {return _members;}
    set
    {
            _members = value;
            OnPropertyChanged("Members");
    }
}

将Members设置为_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;

我假设这里发生的事情是,因为将Members设置为_Members实际上是属性设置本身,所以代码"假定"没有任何更改,并跳过事件。但我对这个解释并不满意。有人能进一步解释一下这里发生了什么吗?

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

ObservableCollections的绑定不会重新绑定列表,除非集合引用不同,因此最后一段代码正在工作。也就是说,除非你真的在底层_members列表中添加或删除项目,否则你不应该重新绑定整个列表。

因此(我假设)如果您的目标是刷新SelectedMember的状态,那么您可能缺少从Selected属性中引发的OnPropertyChanged("Selected")

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