Skip to content

Instantly share code, notes, and snippets.

@idiotandrobot
Created September 22, 2015 09:59
Show Gist options
  • Save idiotandrobot/bf996655a984fbfb07e0 to your computer and use it in GitHub Desktop.
Save idiotandrobot/bf996655a984fbfb07e0 to your computer and use it in GitHub Desktop.
ObservableContainer
public interface IObservableContainerItem<T>
{
T Observed { get; set; }
}
using System.Collections.ObjectModel;
using System.Linq;
public class ObservableContainer<O, U> : ObservableCollection<O> where O : IObservableContainerItem<U>, new()
{
public ObservableCollection<U> UnderObservation { get; private set; }
public ObservableContainer(ObservableCollection<U> underObservation)
: base(underObservation.Select(u => NewObserver(u)))
{
UnderObservation = underObservation;
UnderObservation.CollectionChanged += UnderObservation_CollectionChanged;
}
private void UnderObservation_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach (var item in e.NewItems.OfType<U>())
{
Add(NewObserver(item));
}
}
if (e.OldItems != null)
{
foreach (var item in e.OldItems.OfType<U>())
{
Remove(this.First(o => ((IObservableContainerItem<U>)o).Observed.Equals(item)));
}
}
}
private static O NewObserver(U u)
{
var observer = new O();
((IObservableContainerItem<U>)observer).Observed = u;
return observer;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment