我正在努力学习更多关于BindingList的知识,因为我相信它会对我正在从事的一个项目有所帮助。
目前,我有一个对象类(ScannedImage),它是一个类(HashedImage)的子类型,该类对本机图像对象( .Net )进行子类型化。我没有理由不能将这两个子类型一起移动。我只是简单地子键入了一个我之前构造的对象,但现在我将把我的ScannedImage对象存储在一个关系数据库中(嗯,从技术上讲不是这样的--只有细节和可能的缩略图)。
此外,object类的成员类型是我自己的自定义类型(关键字)。我使用了一个自定义的datagridview来呈现这些对象,但是我使用自己的代码来处理对ScannedImage对象的所有更改。正如您可能想象的那样,我有相当多的事件要处理这些基类型中发生的事件。
那么,如果我更改了对象以实现INotifyPropertyChanged,对象集合(实现BindingList)会收到ScannedImage对象更改的通知吗?
此外,如果关键字要实现INotifyPropertyChanged,BindingList是否可以通过ScannedImage对象访问更改?
抱歉,如果这看起来有点新奇的话。我最近才发现了BindingList,而且没有接受过C#编程方面的正式培训--我在这方面有一段艰难的时间。
此外,如果任何人有任何好的参考资料,我将感谢链接。显然,我已经仔细阅读了MSDN Library。我在网上找到了一些不错的链接,但似乎现在很多人都在使用WPF和ObservableCollection。
我的项目是基于Winforms和.Net3.5框架的。
提亚
发布于 2010-05-10 06:19:17
我会回答你的两个问题:
如果我将对象更改为实现INotifyPropertyChanged,对象集合(实现BindingList)是否会收到ScannedImage对象更改的通知?
如果您在System.ComponentModel中实际使用了BindingList类,那么它确实包含了执行INotifyPropertyChanged的元素的特殊情况代码。列表将看到属性更改并发出通知。
然而,您特别询问的是“实现BindingList”,这是微妙的不同。您不能实现类。但是有一个接口IBindingList,您可以用自己的类实现它,如果这是您选择采用的路线,那么在编写list类时,您就有责任确保监视属性更改通知。
通常,您不需要创建自己的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自动从其内部Keywords类挂钩PropertyChanged事件,并引发一个单独的属性changed事件,声明Keywords已更改。这样,绑定列表和其他数据绑定控件将在关键字更改时收到通知。
https://stackoverflow.com/questions/2799181
复制相似问题