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实际上是属性设置本身,所以代码"假定"没有任何更改,并跳过事件。但我对这个解释并不满意。有人能进一步解释一下这里发生了什么吗?
ObservableCollections的绑定不会重新绑定列表,除非集合引用不同,因此最后一段代码正在工作。也就是说,除非你真的在底层_members
列表中添加或删除项目,否则你不应该重新绑定整个列表。
因此(我假设)如果您的目标是刷新SelectedMember的状态,那么您可能缺少从Selected
属性中引发的OnPropertyChanged("Selected")
。
总之:必须在PropertyChanged事件中命名正在更改的属性。事件必须来自拥有该属性的对象。在这种情况下,通知WPF Selected
属性的更改需要在Member
实例上引发事件。