实现BindingList <t> </t>

时间:2010-05-09 21:05:48

标签: c# .net inotifypropertychanged bindinglist

我正在尝试了解有关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

1 个答案:

答案 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已更改。这样,绑定列表和其他数据绑定控件在关键字更改时收到通知。