using System;
using System.Collections.Generic;namespace SPFControls {
public class ObservableCollection<T>: IList<T> {
private List<T> items = new List<T>();
public event NotifyCollectionChangedEventHandler<T> CollectionChanged;
public ObservableCollection() {
}
public void Add(T item) {
this.items.Add(item);
this.FireCollectionChanged(NotifyCollectionChangedAction.Add, item);
}
public void AddRange(IEnumerable<T> items) {
this.items.AddRange(items);
this.FireCollectionChanged(NotifyCollectionChangedAction.Add, items);
}
public void Clear() {
this.items.Clear();
this.FireCollectionChanged(NotifyCollectionChangedAction.Reset, null);
}
public bool Contains(T item) {
return this.items.Contains(item);
}
public void CopyTo(T[] array, int arrayIndex) {
this.items.CopyTo(array, arrayIndex);
}
public int Count {
get { return this.items.Count; }
}
public bool IsReadOnly {
get { return false; }
}
public bool Remove(T item) {
bool removed = this.items.Remove(item);
this.FireCollectionChanged(NotifyCollectionChangedAction.Remove, item);
return removed;
}
public T this[int index] {
get { return this.items[index]; }
set {
this.FireCollectionChanged(NotifyCollectionChangedAction.Remove, this.items[index]);
this.items[index] = value;
this.FireCollectionChanged(NotifyCollectionChangedAction.Add, value);
}
}
public int IndexOf(T item) {
return this.items.IndexOf(item);
}
public void Insert(int index, T item) {
this.items.Insert(index, item);
}
public void RemoveAt(int index) {
this.items.RemoveAt(index);
}
public IEnumerator<T> GetEnumerator() {
return this.items.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
return this.items.GetEnumerator();
}
protected void FireCollectionChanged(NotifyCollectionChangedAction action, IEnumerable<T> changedItems) {
if (this.CollectionChanged != null)
this.CollectionChanged(this, new NotifyCollectionChangedEventArgs<T>(action, changedItems));
}
protected void FireCollectionChanged(NotifyCollectionChangedAction action, T changedItem) {
if (this.CollectionChanged != null)
this.CollectionChanged(this, new NotifyCollectionChangedEventArgs<T>(action, changedItem));
}
}
public delegate void NotifyCollectionChangedEventHandler<T>(object sender, NotifyCollectionChangedEventArgs<T> e);
public class NotifyCollectionChangedEventArgs<T>: EventArgs {
private IList<T> changedItems;
private NotifyCollectionChangedAction action;
public NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction action, IEnumerable<T> changedItems ) {
this.action = action;
List<T> changedList = new List<T>();
if (changedItems != null)
changedList.AddRange(changedItems);
this.changedItems = changedList;
}
public NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction action, T changedItem) {
this.action = action;
this.changedItems = new List<T>();
this.changedItems.Add(changedItem);
}
public NotifyCollectionChangedAction Action {
get { return this.action; }
}
public IEnumerable<T> NewItems {
get {
if (this.action != NotifyCollectionChangedAction.Add)
return EmptyEnumerable<T>.Instance;
return this.changedItems;
}
}
public IEnumerable<T> OldItems {
get {
if (this.action != NotifyCollectionChangedAction.Remove)
return EmptyEnumerable<T>.Instance;
return this.changedItems;
}
}
}
public enum NotifyCollectionChangedAction {
Add,
Remove,
Reset
}
}
using System;
using System.Collections.Generic;namespace SPFControls {
public class EmptyEnumerable<T> : IEnumerable<T>, IEnumerator<T> {
private static EmptyEnumerable<T> instance = new EmptyEnumerable<T>();
protected EmptyEnumerable() {
}
public IEnumerator<T> GetEnumerator() {
return this;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
return this;
}
public T Current {
get { throw new ArgumentException(); }
}
public void Dispose() {
}
object System.Collections.IEnumerator.Current {
get { throw new ArgumentException(); }
}
public bool MoveNext() {
return false;
}
public void Reset() {
}
public static EmptyEnumerable<T> Instance {
get { return EmptyEnumerable<T>.instance; }
}
}
}
Like this:
Like Loading...
[...] The only thing interesting about this class is actual children Collection. Since in Silverlight there is no collection class that actually fires event when an item is added (something like ObservableCollection), you need to implement one. Code here is courtasy Peter Blois. Link to code that Peter gave me are here. [...]
Recursive Reflection : Silverlight Toolbar
May 14, 2007 at 3:54 pm
[...] The only thing interesting about this class is actual children Collection. Since in Silverlight there is no collection class that actually fires event when an item is added (something like ObservableCollection), you need to implement one. Code here is courtasy Peter Blois. Link to code that Peter gave me are here. [...]
Silverlight Toolbar « Desperately Seeking Love of Sophie
May 14, 2007 at 3:54 pm