この質問は、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の実装内で、アドレスオブジェクトの変更通知をサブスクライブしてから、それらを「アドレス」への変更として伝播する必要がありますか?
この点に到達した場合は、この長く曲がりくねった質問を読むのに時間を割いていただきありがとうございます。