【发布时间】:2014-12-23 15:29:16
【问题描述】:
这是一个奇怪的行为。我们最近在一个 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 获取对成员的引用,该引用已更新。成员和 _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 实际上是属性设置本身,代码“假定”没有任何变化,并跳过事件。但我对这个解释并不满意。谁能进一步说明这里发生了什么?
【问题讨论】:
-
MembersToCount是另一个属性吗?你不应该/而不是为Members属性引发属性更改事件吗? -
MembersToCount这是什么?你能显示你的那个属性的代码吗? -
..另外,最后一个示例中有错字吗?将
OC<MembersToCount>分配给类型为OC<Member>的Members 变量肯定会导致编译错误 -
对不起,对不起,糟糕的复制和粘贴工作。希望现在更有意义。很抱歉浪费了大家的时间。
-
@MattThrower 它不起作用,因为它仍在检查 UI 刷新之前值是否已更改。如果您想这样做,您可以先将其设置为 null,然后再设置为
_members
标签: c# wpf mvvm properties inotifypropertychanged