【问题标题】:do something before collection changes in observablecollection in wpf在 wpf 中的 observablecollection 中的集合更改之前做一些事情
【发布时间】:2011-06-10 12:39:53
【问题描述】:

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

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

【问题讨论】:

  • 您提到要在集合更改之前做一些事情,因此更改的事件为时已晚。你能举个例子说明你正在尝试做什么吗?

标签: c# .net wpf observablecollection


【解决方案1】:

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

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

这里有一些示例代码可以帮助您入门。它来源于集合:

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");
    }
}

【讨论】:

  • 感谢您的指导。我几乎按照你的建议做了,但我没有从 Collection 类继承,而是从 ObservableCollection 类继承,这就是诀窍。再次感谢。
【解决方案2】:

你已经够清楚了,简单的回答是:没有这样的事件,也不可能。
我能想到的唯一解决方案是从ObservableCollection&lt;T&gt; 派生并自己实现该功能,即在Add 的实现中,您将首先引发CollectionChanging 事件,然后调用基类的Add 方法。您将对所有其他相关方法执行相同的操作。

说了这么多,我不太确定,这是正确的做法。您能否说明您需要此功能的原因?

【讨论】:

  • 感谢您的指导。我照你说的做了(当然做了一些改变),它奏效了。再次感谢。
  • 我最近不得不这样做以实现 Observables 的纪念品模式。这可能不是最好的方法,但考虑到我有时间,……唯一的选择。
【解决方案3】:

实际上,ObservableCollection 中的集合更改事件会在以下情况下触发(除其他外):

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

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

话虽如此,我想您只需要找到这些操作发生的位置并将您的代码放在这里...

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

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