gpt4 book ai didi

wpf - 更多详细信息 - 当嵌套实现 INotifyPropertyChanged 的​​属性时,父对象必须传播更改吗?

转载 作者:行者123 更新时间:2023-12-04 23:47:25 25 4
gpt4 key购买 nike

我的问题几乎就像下面的现有问题: When nesting properties that implement INotifyPropertyChanged must the parent object propogate changes?

我的问题是如果我有如下三个级别人 接触 地址

    public class Address : INotifyPropertyChanged
{
string m_city;
public string City
{
get { return m_city; }
set
{
m_city = value;
NotifyPropertyChanged(new PropertyChangedEventArgs("City"));
}
}
}

public class Contact : INotifyPropertyChanged
{
Address m_address;

public Address Address
{
get { return m_address = value; }
set
{
m_address = value;
NotifyPropertyChanged(new PropertyChangedEventArgs("Address"));
}
}
}

public class Person : INotifyPropertyChanged
{
Contact m_contact;

public Contact ContactInfo
{
get { return m_contact = value; }
set
{
m_contact = value;
NotifyPropertyChanged(new PropertyChangedEventArgs("ContactInfo"));
}
}
}

我有一个包含联系人用户控件的个人用户控件。当我更改城市时,它会调用地址类中城市属性的 notifyPropertychanged。和它既不调用 Contact 类下的 Address setter,也不调用 Person 类下的 Contact setter。city property发生变化时如何通知person类???

最佳答案

如果其他类有兴趣使用它,则必须注册到地址的 PropertyChanged 事件

例如,Contact 只会在 Address 上引发 PropertyChanged 事件,如果对象引用发生更改,例如设置 Address = new Address()Address = null。它不关心 Address 的属性,这是正确的。如果您希望它关心属性,请在 Address.PropertyChanged 上连接一个 PropertyChange 事件以引发 Contact.Address PropertyChange 事件

public class Contact : INotifyPropertyChanged
{
Address m_address;

public Address Address
{
get { return m_address = value; }
set
{
// Remove old PropertyChanged notification if it existed
if (m_address != null)
m_address.PropertyChanged -= Address_PropertyChanged;

m_address = value;

// Add new PropertyChanged notification if it existed
if (m_address != null)
m_address.PropertyChanged += Address_PropertyChanged;

NotifyPropertyChanged(new PropertyChangedEventArgs("Address"));
}
}
}


void Address_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "City")
NotifyPropertyChanged(new PropertyChangedEventArgs("Address"));
}

如果您希望事件也冒泡到 Person 类,则必须对 Person 类做同样的事情。

另一种选择是使用某种消息传递系统,例如 MVVM Light 的 Messenger,或 Microsoft Prism 的 EventAggregator。有了这个系统,Address 类会在 City 发生变化时广播一个事件,而 Person 类会订阅这些消息并用任何方式处理它们您希望提供发送消息的 Address 等于 Person.Contact.Address

关于wpf - 更多详细信息 - 当嵌套实现 INotifyPropertyChanged 的​​属性时,父对象必须传播更改吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8609140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com