我不确定我想要实现的目标实际上是否可以实现。
我和我有一个observablecollection,它的collectionchanged事件已经处理好了。我想要做的是我想在observablecollection的collectionchanged事件被触发之前在observablecollection中的现有对象列表中进行一些更改。换句话说,在任何人从observablecollection中添加或删除任何对象之前,我想对observablecollection中的现有对象列表执行某些操作。类似于处理集合事件的事情,但不幸的是,在observablecollection中没有这样的事件。我希望我已经足够清楚了。
答案 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中的集合更改事件在(除其他事项)之外被触发:
当我说“你”时,这意味着如果发生了CollectionChanged事件,这意味着“你”(理解:应用程序中的某些内容)已经添加,删除或清除了列表。
话虽如此,我想你只需要找到这些行动发生的地方并将你的代码放在这里......
答案 3 :(得分:0)
您可以创建自己的INotifyCollectionChanged
实现,它包装集合,侦听事件,根据需要更改集合,然后发送事件。
但是当你更改集合时,会引发另一个事件,所以你必须确保你正确地处理这些事件,可能是通过吞下它们