【问题标题】:How does SelectedListViewItemCollection implement IList but not have Add()?SelectedListViewItemCollection 如何实现 IList 但没有 Add()?
【发布时间】:2012-04-11 16:37:47
【问题描述】:

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

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

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

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

public class SelectedListViewItemCollection : IList, ICollection, IEnumerable

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

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

【问题讨论】:

    标签: c# winforms interface .net-2.0


    【解决方案1】:

    这些方法已实现explicitly
    比如用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访问,因为它是一个嵌套类。

    【讨论】:

    • 添加了一点关于SelectedSelectedItemsCollection 工作原理的说明。
    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多