我试图模仿ListView和其他控件处理SelectedItems集合的方式。我有一个包含项集合的类,每个Item都有一个Selected属性。
我想模仿Item可以更改其自己的Selected属性的智能行为,这样做会在父类中引发SelectedItemsChanged事件,而且SelectedItems集合现在应该反映更改。
我正在尝试实现一个SelectedItemsCollection类,该类不包含内部列表,而是检查主项列表中每个项的Selected状态。这样就不需要不断更新并与主列表同步。
我正在查看ListView.SelectedListViewItemCollection的元数据,它有以下声明:
public class SelectedListViewItemCollection : IList, ICollection, IEnumerable
它没有实现Add,Remove,RemoveAt等。这是不是违反了使用IList接口的规则?没有实现它我无法编译。这只是元数据创建方式的一个小问题吗?
我应该如何模仿此功能?
答案 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的内部成员上执行的,因为它是一个嵌套类。