我在一个对象中有一个对象。当我更改子对象内的单个属性时,只有该属性会收到属性更改通知。我希望能够从父对象级别检测到该更改。
我已经看到这个问题的许多变体,但没有人真正回答它,他们建议变通,这似乎对我不起作用。
这是一个简化的例子。我有两个类——一个包含多个对象的列表,另一个类定义这些对象。
class MyObjectList : ObservableObject
{
private ObservableCollection<MyObject> allObjects;
public ObservableCollection<MyObject> AllObjects
{
get { return allObjects; }
set { allObjects = value; OnPropertyChanged(); }
}
}
class MyObject : ObservableObject
{
private string name;
public string Name
{
get { return name; }
set { name = value; OnPropertyChanged();
//I want to let MyObjectList know that an item in its AllObjects collection has changed, like "OnPropertyChanged(nameof(AllObjects))" but that doesn't work}
}
public MyObject(string myName)
{
Name = myName;
}
}
两个类都继承自处理属性更改通知的“ObservableObject”类。
class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
对于这个例子,假设我有一个“MyObjectList”,它的“AllObjects”属性包含 3 个“MyObject”对象,名称分别为“object1”、“object2”和“object3”。
ViewModel:
MyObjectList objectList1 = new MyObjectList();
objectList1.AllObjects.Add(new MyObject("object1"));
objectList1.AllObjects.Add(new MyObject("object2"));
objectList1.AllObjects.Add(new MyObject("object3"));
objectList1.AllObjects[1].Name = "testing";
我希望用户能够重命名一个对象,确保同一个 MyObjectList 中没有名称冲突。现在,当 Object2 的名称更改时,它会引发该特定 MyObject 对象的“名称”属性的属性更改事件。该对象不知道“AllObjects”中的其他对象。只有 objectList1 可以检查其“AllObjects”集合并查看是否存在命名冲突。有什么方法可以让 Object2 的更改向上渗透到 objectList1 中的“AllObjects”?
如果你需要它,下面是绑定在视图上的工作方式:
<TextBox Text="{Binding Object1.Name, UpdateSourceTrigger=PropertyChanged}"/>
提前谢谢你!