0

我需要创建一个实现 IBindingList 的自定义集合,以便能够将它与来自第 3 方的自定义控件绑定。我遇到的另一个问题是我必须使该集合线程安全,因为我同时从多个线程手动插入项目。

无论如何,我BindingList<T>在课堂上使用 a 作为字段,以免过多地重新发明轮子。所以我的课看起来像:

class ThreadSaveBindingCollection<T> : IEnumerable<T>, IBindingList
{
    BindingList<T> collection;
    object _lock = new object();

    // constructors
    public ThreadSaveBindingCollection(IEnumerable<T> initialCollection)
    {
        if (initialCollection == null)
            collection = new BindingList<T>();
        else                            
            collection = new BindingList<T>(new List<T>(initialCollection));                                 
    }
    public ThreadSaveBindingCollection() : this(null)
    {            
    }   

    // Todo: Implement interfaces using collection to do the work    
}

注意我缺少实现接口 IEnumerable 和 IBinding 列表。我计划让该领域collection处理这些问题,因为它也实现了这些接口。所以我让 Visual Studio 显式地实现接口并用throw new NotImplementedException()字段collection实现替换,最终得到如下结果:

在此处输入图像描述

现在的问题是

如果集合声称实现 IBindingList,为什么我不能在字段集合上调用方法 AddIndex!?

在此处输入图像描述

我无法对几种方法做同样的事情

4

3 回答 3

1

它由 明确实现BindingList,您需要将您的引用collection转换IBindingList为使用它:

(collection as IBindingList).AddIndex(property);

http://msdn.microsoft.com/en-us/library/ms132679.aspx

进一步阅读

通过接口本身的引用显式实现和访问的要点是解决命名冲突,其中双方创建两个具有相同方法签名的单独接口 - 它允许您在实现两个接口的同时消除方法的歧义。

于 2012-11-23T16:38:28.590 回答
1

这是因为它是接口的显式实现,而不是隐式实现。这意味着您必须通过接口而不是类型本身来调用它。例如:

((IBindingList)collection).AddIndex(property);

有关显式接口实现的更多信息,请参见此处。

于 2012-11-23T16:39:00.647 回答
1

BindingList显式实现IBindingList,所以你需要做

(collection as IBindingList).AddIndex(property);
于 2012-11-23T16:39:51.993 回答