Questo è stato il successo su Google, quindi ho pensato di aggiungere la mia soluzione nel caso in cui altre persone lo cercassero.
Utilizzando le informazioni di cui sopra (sulla necessità di eseguire il cast su INotifyCollectionChanged ), ho creato due metodi di estensione per la registrazione e l' annullamento della registrazione.
La mia soluzione - Metodi di estensione
public static void RegisterCollectionChanged(this INotifyCollectionChanged collection, NotifyCollectionChangedEventHandler handler)
{
collection.CollectionChanged += handler;
}
public static void UnregisterCollectionChanged(this INotifyCollectionChanged collection, NotifyCollectionChangedEventHandler handler)
{
collection.CollectionChanged -= handler;
}
Esempio
IThing.cs
public interface IThing
{
string Name { get; }
ReadOnlyObservableCollection<int> Values { get; }
}
Utilizzo dei metodi di estensione
public void AddThing(IThing thing)
{
thing.Values.RegisterCollectionChanged(this.HandleThingCollectionChanged);
}
public void RemoveThing(IThing thing)
{
thing.Values.UnregisterCollectionChanged(this.HandleThingCollectionChanged);
}
Soluzione di OP
public void AddThing(IThing thing)
{
INotifyCollectionChanged thingCollection = thing.Values;
thingCollection.CollectionChanged += this.HandleThingCollectionChanged;
}
public void RemoveThing(IThing thing)
{
INotifyCollectionChanged thingCollection = thing.Values;
thingCollection.CollectionChanged -= this.HandleThingCollectionChanged;
}
Alternativa 2
public void AddThing(IThing thing)
{
(thing.Values as INotifyCollectionChanged).CollectionChanged += this.HandleThingCollectionChanged;
}
public void RemoveThing(IThing thing)
{
(thing.Values as INotifyCollectionChanged).CollectionChanged -= this.HandleThingCollectionChanged;
}