对象更改时 ObservableCollection/INotifyPropertyChange 如何工作

问题描述 投票:0回答:1

我遇到一种情况,在一个视图模型中,对象的某些属性被更新。在另一个视图模型中,我订阅消息,然后使用这个新对象更新集合,例如:

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
事件(因为它既不是集合上的添加/更新/重新排序),与更改对象上的属性不同。

那么两个问题:

  1. 我对为什么这不起作用的理解正确吗?
  2. 处理任何/所有属性可能已更改的情况的最佳方法是什么?我想避免必须手动为对象上的每个属性编写更新(如果添加新属性并且我忘记更新此消息收据,则会中断)。
c# .net wpf .net-6.0
1个回答
0
投票

表情

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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.