SelectedListViewItemCollection如何实现IList但没有Add()?

时间:2012-04-11 16:37:48

标签: c# winforms interface .net-2.0

我试图模仿ListView和其他控件处理SelectedItems集合的方式。我有一个包含项集合的类,每个Item都有一个Selected属性。

我想模仿Item可以更改其自己的Selected属性的智能行为,这样做会在父类中引发SelectedItemsChanged事件,而且SelectedItems集合现在应该反映更改。

我正在尝试实现一个SelectedItemsCollection类,该类不包含内部列表,而是检查主项列表中每个项的Selected状态。这样就不需要不断更新并与主列表同步。

我正在查看ListView.SelectedListViewItemCollection的元数据,它有以下声明:

public class SelectedListViewItemCollection : IList, ICollection, IEnumerable

它没有实现Add,Remove,RemoveAt等。这是不是违反了使用IList接口的规则?没有实现它我无法编译。这只是元数据创建方式的一个小问题吗?

我应该如何模仿此功能?

1 个答案:

答案 0 :(得分:3)

这些方法已实施explicitly 例如,使用ILspy反汇编类,您可以看到Add()方法的实现方式如下:

int IList.Add(object value)
{
    throw new NotSupportedException();
}

因此,例如,如果您有SelectedItemsCollection的实例并且想要调用Add()方法,则必须将对象强制转换为IList,例如:

((IList)mySelectedItemsCollection).Add(...)

是的,如果你通过Visual Studio查看类的元数据,隐藏显式实现的方法。

关于Selected属性...... “技巧”是每个项目都引用了它所属的ListView。当Selected属性发生更改时,该项会调用listView的SetSelectedState()方法,该方法会引发SelectedChanged事件。

同样在构造函数中传递SelectedItemsCollection引用创建ListView,这样,元素的枚举实际上是在SelectedItemsCollection可访问的ListView的内部成员上执行的,因为它是一个嵌套类。