我遇到一种情况,在一个视图模型中,对象的某些属性被更新。在另一个视图模型中,我订阅消息,然后使用这个新对象更新集合,例如:
WeakReferenceMessenger.Default.Register<UpdatedMessage>(this, (r, m) =>
{
if (this.MyObjects != null)
{
var myObj = this.MyObjects.FirstOrDefault(x => x.MyObject == m.Value.MyObject);
if (myObj != null)
{
myObj = m.Value;
//myObj.MyProperty = m.Value.MyProperty; //this updates UI, above line does not
}
}
});
即使
MyObject
实现 INotifyPropertyChanged
并且 MyObjects
是 ObservableCollection<MyObject>
,WPF UI 也不会更新。
但是,如果我像这样更新
myObj
上的属性:
myObj.MyProperty = m.Value.MyProperty;
WPF UI 确实更新。
我认为这是因为更改对象不会触发
PropertyChanged
事件(因为它既不是集合上的添加/更新/重新排序),与更改对象上的属性不同。
那么两个问题:
表情
myObj = m.Value;
仅更改局部变量的值,因此不会更新 UI。
您必须替换
MyObjects
集合中的对象:
if (MyObjects != null)
{
for (int i = 0; i < MyObjects.Count; i++)
{
if (MyObjects[i].MyObject == m.Value.MyObject)
{
MyObjects[i] = m.Value;
break;
}
}
}