我来回答你的两个问题:
如果我将我的对象更改为实现INotifyPropertyChanged,那么实现BindingList的对象集合会收到有关ScannedImage对象更改的通知吗?
如果你实际上在System.ComponentModel中使用BindingList类,那么它确实包含特殊情况代码,用于实现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
自动挂钩其内部的Keywords
类中的PropertyChanged
事件,并引发单独的属性更改事件,说Keywords
已更改。 这样,绑定列表和其他数据绑定控件将在关键字更改时接收通知。