在wpf中observablecollection中的集合更改之前执行某些操作

时间:2011-06-10 12:39:53

标签: c# .net wpf observablecollection

我不确定我想要实现的目标实际上是否可以实现。

我和我有一个observablecollection,它的collectionchanged事件已经处理好了。我想要做的是我想在observablecollection的collectionchanged事件被触发之前在observablecollection中的现有对象列表中进行一些更改。换句话说,在任何人从observablecollection中添加或删除任何对象之前,我想对observablecollection中的现有对象列表执行某些操作。类似于处理集合事件的事情,但不幸的是,在observablecollection中没有这样的事件。我希望我已经足够清楚了。

4 个答案:

答案 0 :(得分:4)

由于您需要在之前采取行动用户更改集合,我相信您的CollectionChangedEvent发生得太晚(集合已经更改)。

相反,请考虑创建自己的集合类,该类派生自ObservableCollection ,然后重写Add(),Insert()和Remove()方法,以便在调用基类实现之前进行额外的处理。您应该能够在网上找到相关的示例。

以下是一些示例代码,可帮助您入门。它来自Collection:

public class MyCollection<T> : Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged
{
    public MyCollection(Collection<T> list)
        : base(list)
    {
    }

    public MyCollection()
        : base()
    {
    }

    #region INotifyCollectionChanged Members

    public event NotifyCollectionChangedEventHandler CollectionChanged;

    protected void NotifyChanged(NotifyCollectionChangedEventArgs args)
    {
        NotifyCollectionChangedEventHandler handler = CollectionChanged;
        if (handler != null)
        {
            handler(this, args);
        }
    }
    #endregion

    public new void Add(T item)
    {
        // Do some additional processing here!

        base.Add(item);
        this.NotifyChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, base.Count-1));
        this.OnPropertyChanged("Count");
    }
}

答案 1 :(得分:2)

你已经足够清楚,简单的答案是:没有这样的事件,这是不可能的 我能想到的唯一解决方案是从ObservableCollection<T>派生并自己实现该功能,即在Add的实现中,您首先会引发CollectionChanging事件,然后调用{{1}基类的方法。对于所有其他相关方法,您也会这样做。

说了这么多,我不确定,这是正确的做法。你能说明为什么需要这个功能吗?

答案 2 :(得分:0)

实际上,ObservableCollection中的集合更改事件在(除其他事项)之外被触发:

  • 您将项目添加到ObservableCollection。
  • 您从ObservableCollection中删除了一个项目。
  • 清除ObservableCollection。

当我说“你”时,这意味着如果发生了CollectionChanged事件,这意味着“你”(理解:应用程序中的某些内容)已经添加,删除或清除了列表。

话虽如此,我想你只需要找到这些行动发生的地方并将你的代码放在这里......

答案 3 :(得分:0)

您可以创建自己的INotifyCollectionChanged实现,它包装集合,侦听事件,根据需要更改集合,然后发送事件。

但是当你更改集合时,会引发另一个事件,所以你必须确保你正确地处理这些事件,可能是通过吞下它们