我需要创建一个实现IBindingList的自定义集合,以便能够将它与来自第三方的自定义控件绑定。我的另一个问题是我必须使该集合线程安全,因为我同时从多个线程手动插入项目。
无论如何我在班上使用BindingList<T>
作为一个字段,以便不再重新发明轮子。所以我的班级看起来像:
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方法!
我无法对多种方法做同样的事情
答案 0 :(得分:1)
由BindingList
明确表示,您需要将collection
的引用转换为IBindingList
才能使用它:
(collection as IBindingList).AddIndex(property);
http://msdn.microsoft.com/en-us/library/ms132679.aspx
通过接口本身的引用显式实现和访问的目的是解决命名冲突,其中双方创建具有相同方法签名的两个单独的接口 - 它允许您在仍然实现两个接口的同时消除方法的歧义。 p>
答案 1 :(得分:1)
这是因为它是接口的显式实现,而不是隐式的。这意味着您必须通过界面而不是类型本身来调用它。例如:
((IBindingList)collection).AddIndex(property);
有关显式接口实现的更多信息,请参阅here。
答案 2 :(得分:1)
BindingList
明确实现IBindingList
,因此您需要执行
(collection as IBindingList).AddIndex(property);