我正在尝试了解有关BindingList的更多信息,因为我相信它会帮助我完成我正在进行的项目。
目前,我有一个对象类(ScannedImage),它是一个类(HashedImage)的子类型,它对一个原生.Net对象(Image)进行子类型化。我没有理由不能将这两个子类型组合在一起。我只是对我之前构建的对象进行子类型化,但我现在将我的ScannedImage对象存储在RDB中(好吧,不是技术上 - 只有细节,可能还有缩略图)。
此外,对象类的成员类型是我自己的自定义类型(关键字)。我使用自定义datagridview来呈现这些对象,但我正在用我自己的代码处理对ScannedImage对象的所有更改。正如您可能想象的那样,我有很多事件可以处理这些基类型中发生的事件。
因此,如果我更改了我的对象以实现INotifyPropertyChanged,那么对象集合(实现BindingList)是否会收到有关ScannedImage对象更改的通知?
此外,如果要实现INotifyPropertyChanged的关键字,BindingList是否可以通过ScannedImage对象访问更改?
对不起,如果这看起来相当新鲜。我最近才发现了BindingList并没有接受过C#编程的正式培训 - 我很难向前迈进。
此外,如果有人有任何好的参考资料,我会感谢链接。显然,我已经仔细阅读了MSDN Library。我在网上找到了一些很好的链接,但似乎很多人现在都在使用WPF和ObservableCollection。
我的项目基于Winforms和.Net3.5框架。
TIA
答案 0 :(得分:1)
我会回答你的两个问题:
[我]我更改了我的对象以实现INotifyPropertyChanged,对象集合(实现BindingList)是否会收到ScannedImage对象更改的通知?
如果您实际使用System.ComponentModel
内的BindingList<T>
类,那么它确实包含用于推动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
已更改。这样,绑定列表和其他数据绑定控件将在关键字更改时收到通知。