再次讀這篇文章,我覺得你這樣的事情之後是:
public sealed class CollectionEventMonitor<TItem, TEventArgs> : IDisposable
where TEventArgs: EventArgs
{
private readonly INotifyCollectionChanged _collection;
private readonly Action<TItem, EventHandler<TEventArgs>> _addEvent;
private readonly Action<TItem, EventHandler<TEventArgs>> _removeEvent;
public event EventHandler<TEventArgs> ItemFiredEvent;
public CollectionEventMonitor(INotifyCollectionChanged collection,
Action<TItem, EventHandler<TEventArgs>> addEvent,
Action<TItem, EventHandler<TEventArgs>> removeEvent)
{
_addEvent = addEvent;
_removeEvent = removeEvent;
_collection = collection;
_collection.CollectionChanged += _collection_CollectionChanged;
}
void _collection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
foreach (var item in e.NewItems.Cast<TItem>())
_addEvent(item, OnItemFiredEvent);
break;
case NotifyCollectionChangedAction.Remove:
foreach (var item in e.OldItems.Cast<TItem>())
_removeEvent(item, OnItemFiredEvent);
break;
case NotifyCollectionChangedAction.Replace:
foreach (var item in e.OldItems.Cast<TItem>())
_removeEvent(item, OnItemFiredEvent);
foreach (var item in e.NewItems.Cast<TItem>())
_addEvent(item, OnItemFiredEvent);
break;
case NotifyCollectionChangedAction.Move:
break;
case NotifyCollectionChangedAction.Reset:
foreach (var item in e.OldItems.Cast<TItem>())
_removeEvent(item, OnItemFiredEvent);
break;
default:
throw new ArgumentOutOfRangeException();
}
}
private void OnItemFiredEvent(Object item, TEventArgs eventArgs)
{
var handler = ItemFiredEvent;
if (handler != null)
handler(item, eventArgs);
}
public void Dispose()
{
_collection.CollectionChanged -= _collection_CollectionChanged;
}
}
這是粗糙的和未經考驗的,但它應該給你的基本理念。您可以使用這樣的:
var collection = new ObservableCollection<Foo>();
var monitor =
new CollectionEventMonitor<Foo, EventArgs>(collection,
(foo,handler) => foo.Bar += handler,
(foo,handler) => foo.Bar -= handler);
這種方法的好處是,你可以監控項目事件的任何可觀察到的集合,而不是創建一個特殊的包裝集合。您還可以爲同一個集合創建多個監視器實例,允許不同的上下文監視同一個集合上的不同項目事件。
「沒有界面」:我不明白這個評論,你是什麼意思? – 2010-09-28 22:08:29