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

本文关键字:Add IList 实现 何实现 SelectedListViewItemCollection | 更新日期: 2023-09-27 18:30:58

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

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

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

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

public class SelectedListViewItemCollection : IList, ICollection, IEnumerable

它不实现添加、删除、删除等。 这不是违反使用 IList 界面的规则吗? 如果不实现它们,我就无法编译。 这只是元数据创建方式上的一个小故障吗?

我应该如何模拟此功能?

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

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

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

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

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

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

关于Selected物业...好吧,"诀窍"是每个项目都引用了它所属ListView。当Selected属性更改时,该项将调用引发SelectedChanged事件的 listView SetSelectedState()方法。

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