3

我正在尝试了解有关 BindingList 的更多信息,因为我相信它将帮助我完成我正在从事的项目。

目前,我有一个对象类 (ScannedImage),它是一个类 (HashedImage) 的子类型,它是本机 .Net 对象 (Image) 的子类型。我没有理由不能将这两种亚型一起移动。我只是对我之前构建的一个对象进行子类型化,但我现在将我的 ScannedImage 对象存储在一个 RDB 中(嗯,技术上不是 - 只有细节,可能还有缩略图)。

此外,对象类的成员类型是我自己的自定义类型(关键字)。我正在使用自定义数据网格视图来呈现这些对象,但我正在使用我自己的代码处理对 ScannedImage 对象的所有更改。正如您可能想象的那样,我有很多事件要处理,这些事件发生在这些基本类型中。

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

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

抱歉,如果这看起来很新奇。我最近才发现 BindingList 并且没有接受过 C# 编程方面的正式培训——我很难继续前进。

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

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

TIA

4

1 回答 1

1

我会回答你的两个问题:

[I]如果我更改我的对象以实现 INotifyPropertyChanged,对象集合(实现 BindingList)是否会收到 ScannedImage 对象更改的通知?

如果您实际使用BindingList<T>里面的类System.ComponentModel,那么它确实包含用于推动 的元素的特殊情况代码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中挂钩事件,并引发一个单独的属性更改事件,表示已更改。这样,绑定列表和其他数据绑定控件在关键字更改时收到通知。PropertyChangedKeywordsKeywords

于 2010-05-09T22:19:16.787 回答