【发布时间】:2010-11-23 02:41:59
【问题描述】:
这个问题将表明我在实施/使用 INotifyPropertyChanged 时缺乏对预期行为的理解:
问题是 - 为了让绑定按预期工作,当您有一个自身实现 INotifyPropertyChanged 的类时,该类具有 INotifyPropertyChanged 类型的嵌套属性,您是否希望在内部订阅这些属性的更改通知,然后传播通知?或者绑定基础架构是否具有使这变得不必要的智能?
例如(注意这段代码并不完整——只是为了说明问题):
public class Address : INotifyPropertyChanged
{
string m_street
string m_city;
public string Street
{
get { return m_street; }
set
{
m_street = value;
NotifyPropertyChanged(new PropertyChangedEventArgs("Street"));
}
}
public string City
{
get { return m_city; }
set
{
m_city = value;
NotifyPropertyChanged(new PropertyChangedEventArgs("City"));
}
}
public class Person : INotifyPropertyChanged
{
Address m_address;
public Address
{
get { return m_address = value; }
set
{
m_address = value;
NotifyPropertyChanged(new PropertyChangedEventArgs("Address"));
}
}
}
因此,在此示例中,我们在 Person 对象中嵌套了 Address 对象。两者都实现了 INotifyPropertyChanged,因此更改其属性将导致向订阅者传输属性更改通知。
但是假设使用绑定某人正在订阅 Person 对象的更改通知,并且正在“侦听”对 Address 属性的更改。如果 Address 属性本身发生更改(分配了不同的 Address 对象),它们将收到通知,但如果嵌套地址对象(城市或街道)包含的数据发生更改,它们将不会收到通知。
这导致了一个问题 - 绑定基础设施是否应该处理这个问题,或者我应该在我的 Person 实现中订阅地址对象上的更改通知,然后将它们作为“地址”的更改传播?
如果您到了这一点,感谢您花时间阅读这个冗长的问题?
【问题讨论】:
-
我在谷歌搜索后发现了这个问题。在我看来,您似乎必须手动订阅儿童的 PropertyChanged 事件并将其冒泡以在 WPF 绑定中工作。
-
loraderon,我很确定情况并非如此——至少在我的测试中,事实证明是这样。而且,没有其他信息(我发现)可以说明。你有任何链接到你可以提供的任何信息吗?谢谢。菲尔
-
我也没有任何链接。在我当前的项目中,我不得不冒泡 PropertyChanged 事件以使其工作。我是 WPF 和 MVVM 的新手,所以它可能对我的项目来说很特别。
标签: .net inotifypropertychanged