首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现BindingList<T>

实现BindingList<T>
EN

Stack Overflow用户
提问于 2010-05-10 05:05:48
回答 1查看 6.7K关注 0票数 3

我正在努力学习更多关于BindingList的知识,因为我相信它会对我正在从事的一个项目有所帮助。

目前,我有一个对象类(ScannedImage),它是一个类(HashedImage)的子类型,该类对本机图像对象( .Net )进行子类型化。我没有理由不能将这两个子类型一起移动。我只是简单地子键入了一个我之前构造的对象,但现在我将把我的ScannedImage对象存储在一个关系数据库中(嗯,从技术上讲不是这样的--只有细节和可能的缩略图)。

此外,object类的成员类型是我自己的自定义类型(关键字)。我使用了一个自定义的datagridview来呈现这些对象,但是我使用自己的代码来处理对ScannedImage对象的所有更改。正如您可能想象的那样,我有相当多的事件要处理这些基类型中发生的事件。

那么,如果我更改了对象以实现INotifyPropertyChanged,对象集合(实现BindingList)会收到ScannedImage对象更改的通知吗?

此外,如果关键字要实现INotifyPropertyChanged,BindingList是否可以通过ScannedImage对象访问更改?

抱歉,如果这看起来有点新奇的话。我最近才发现了BindingList,而且没有接受过C#编程方面的正式培训--我在这方面有一段艰难的时间。

此外,如果任何人有任何好的参考资料,我将感谢链接。显然,我已经仔细阅读了MSDN Library。我在网上找到了一些不错的链接,但似乎现在很多人都在使用WPF和ObservableCollection。

我的项目是基于Winforms和.Net3.5框架的。

提亚

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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事件作为响应。

示例:

代码语言:javascript
复制
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已更改。这样,绑定列表和其他数据绑定控件将在关键字更改时收到通知。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2799181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档