1

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

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

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

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

public class SelectedListViewItemCollection : IList, ICollection, IEnumerable

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

我应该如何去模拟这个功能?

4

1 回答 1

3

这些方法是明确实现的。
例如用ILspy反汇编类可以看到Add()方法实现如下:

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

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

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

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

关于Selected属性......好吧,“诀窍”是每个项目都有ListView对其所属的引用。当Selected属性更改时,项目调用 SetSelectedState()引发SelectedChanged事件的 listView 的方法。

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

于 2012-04-11T16:45:32.973 回答