这是一种奇怪的行为。我们最近在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;没有任何改变,并跳过事件。但我对这个解释并不满意。任何人都可以进一步阐明这里发生了什么吗?
答案 0 :(得分:1)
对ObservableCollections的绑定不会重新绑定列表,除非集合引用不同,因此最后一段代码正在工作。也就是说,除非您实际在基础_members
列表中添加或删除项目,否则您不必重新绑定整个列表。
所以(我假设)如果您的目标是刷新所选成员的状态,那么您可能缺少OnPropertyChanged("Selected")
属性中的Selected
。
总结:正在更改的属性必须在PropertyChanged事件中命名。事件必须来自拥有该属性的对象。在这种情况下,通知WPF对Selected
属性的更改需要在Member
实例上引发事件。