我会回答你的两个问题:
[I]如果我更改我的对象以实现 INotifyPropertyChanged,对象集合(实现 BindingList)是否会收到 ScannedImage 对象更改的通知?
如果您实际使用BindingList<T>
里面的类System.ComponentModel
,那么它确实包含用于推动 的元素的特殊情况代码INotifyPropertyChanged
。该列表将看到属性更改并将发送通知。
但是,您特别询问“实现 BindingList”,这是有细微差别的。你不能实现一个类。但是有一个接口,IBindingList
您可以使用自己的类来实现,如果这是您选择采用的路线,那么您在编写列表类时有责任确保您监视属性更改通知。
通常,您不需要创建自己的IBindingList
实现;只需用于BindingList<T>
包装现有列表,您就可以了。
此外,如果关键字要实现 INotifyPropertyChanged,BindingList 是否可以通过 ScannedImage 对象访问更改?
不,他们不会。 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
中挂钩事件,并引发一个单独的属性更改事件,表示已更改。这样,绑定列表和其他数据绑定控件将在关键字更改时收到通知。PropertyChanged
Keywords
Keywords