私はあなたの両方の質問に答えます:
[I] INotifyPropertyChanged を実装するようにオブジェクトを変更した場合、オブジェクト コレクション (BindingList を実装) は ScannedImage オブジェクトへの変更の通知を受け取りますか?
実際にBindingList<T>内でクラスを使用する場合System.ComponentModel、 を実行する要素の特別なケースのコードが含まれていますINotifyPropertyChanged。リストにプロパティの変更が表示され、通知が送信されます。
ただし、微妙に異なる「BindingListの実装」について具体的に尋ねます。クラスを実装することはできません。ただし、独自のクラスで実装できるインターフェイス があります。IBindingListこれを選択した場合は、リスト クラスを作成するときに、プロパティの変更通知を確実に監視する必要があります。
IBindingList通常、独自の実装を作成する必要はありません。BindingList<T>既存のリストをラップするために使用するだけで問題ありません。
また、Keywords が INotifyPropertyChanged を実装した場合、変更は ScannedImage オブジェクトを介して BindingList にアクセスできますか?
いいえ彼らはしません。 リスト内の特定BindingList<T>のオブジェクトのみを参照し、すべての依存関係をスキャンしてグラフ内のすべてを監視する機能はありません (可能であれば、常に良い考えではありません)。
通知を受け取りたい場合は、オブジェクトScannedImageからのプロパティ変更通知をチェックするようにクラスを更新しKeywords、それに応じて独自のPropertyChangedイベントを発生させる必要があります。
例:
public class ScannedImage : INotifyPropertyChanged
{
private Keywords keywords;
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
PropertyChangedEventArgs e = new
PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
private void KeywordsChanged(object sender, PropertyChangedEventArgs e)
{
OnPropertyChanged("Keywords");
}
private void SetKeywords(Keywords newKeywords)
{
Keywords oldKeywords = this.keywords;
this.keywords = null;
if (oldKeywords != null)
oldKeywords.PropertyChanged -= KeywordsChanged;
this.keywords = newKeywords;
if (newKeywords != null)
newKeywords.PropertyChanged += KeywordsChanged;
}
public Keywords Keywords
{
get { return keywords; }
set { SetKeywords(value); }
}
public event PropertyChangedEventHandler PropertyChanged;
}
public class Keywords : INotfifyPropertyChanged { ... }
ここで行われていることを理解していただければ幸いです。所有者 は、イベントを内部クラスからScannedImage自動的にフックし、 が変更されたことを示す別のプロパティ変更イベントを発生させます。このようにして、バインド リストやその他のデータ バインディング コントロールは、キーワードが変更されたときに通知を受け取ります。PropertyChangedKeywordsKeywords