【问题标题】:How can I tell when a collection has been edited?我怎样才能知道集合何时被编辑?
【发布时间】:2010-07-22 16:16:44
【问题描述】:

我有一个名为 Items 的公共属性,它是一个列表。我想告诉它什么时候被改变。我该怎么做?

例如,如果调用 Items.Add,我希望能够调用 UpdateInnerList。

我该怎么做?

【问题讨论】:

    标签: c# winforms .net-3.5


    【解决方案1】:

    你能用ObservableCollection吗?

    http://msdn.microsoft.com/en-us/library/ms668604.aspx

    【讨论】:

    • 我对使用 ObservableCollection 的唯一警告是,如果您需要对正在更改的项目进行操作,.Clear() 方法会引发 changed 事件但参数中没有项目,因此,您可以不知道删除了什么。这显然只有在您关心时才有意义。
    • 很高兴知道。感谢您的评论。
    • 链接中的版本信息:支持:4、3.5、3.0
    • @Mark,在 Clear() 的情况下,我怀疑重置将是 CollectionChanged 事件中的操作。在其他情况下,例如添加、删除,我认为 NotifyCollectionChangedEventArgs 上有可以使用的成员? msdn.microsoft.com/en-us/library/…
    • 是的,ObservableCollection 仅适用于 3.5 或更高版本,但问题标记为 .Net 3.5。
    【解决方案2】:

    如何创建一个 List 子类并覆盖 Add 方法?

    void Main()
    {
        var x=new MySpecialList<string>();
        x.Add("hello");
    }
    
    class MySpecialList<T>:List<T>
    {
        public new void Add(T item)
        {
            //special action here
            Console.WriteLine("added "+item);
            base.Add(item);
        }
    }
    

    【讨论】:

    • 如果它作为变量被塞入基础List&lt;T&gt;,则永远不会调用这个.Add
    • “塞进底座……”?我不明白你的意思。
    • List&lt;int&gt; items = new MySpecialList&lt;int&gt;(); items.Add(5); 没有写入控制台输出。这是使用new 来隐藏基类的方法而不是例如实现IList&lt;T&gt; 而不是您建议的方法的祸根。
    【解决方案3】:

    试试ObservableCollection

    它支持CollectionChanged 事件,这应该是您需要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多