WPF:通知父类中子属性的属性更改?

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

我在一个对象中有一个对象。当我更改子对象内的单个属性时,只有该属性会收到属性更改通知。我希望能够从父对象级别检测到该更改。

我已经看到这个问题的许多变体,但没有人真正回答它,他们建议变通,这似乎对我不起作用。

这是一个简化的例子。我有两个类——一个包含多个对象的列表,另一个类定义这些对象。

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}"/>

提前谢谢你!

wpf class object data-binding inotifypropertychanged
© www.soinside.com 2019 - 2024. All rights reserved.