Revision: 34087
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at October 17, 2010 03:57 by electroNik
Initial Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
/// <summary>
/// List that fires events when items are changed
/// </summary>
/// <typeparam name="T">Type of list items</typeparam>
public class ObservableList<T> : IList<T>
{
private IList<T> internalList;
public class ListChangedEventArgs : EventArgs
{
public int index;
public T item;
public ListChangedEventArgs(int index, T item)
{
this.index = index;
this.item = item;
}
}
public delegate void ItemAddedEventHandler(object source, ListChangedEventArgs e);
public delegate void ItemRemovedEventHandler(object source, ListChangedEventArgs e);
public delegate void ListChangedEventHandler(object source, ListChangedEventArgs e);
public delegate void ListClearedEventHandler(object source, EventArgs e);
/// <summary>
/// Fired whenever list item has been changed, added or removed or when list has been cleared
/// </summary>
public event ListChangedEventHandler ListChanged;
/// <summary>
/// Fired when list item has been removed from the list
/// </summary>
public event ItemRemovedEventHandler ItemRemoved;
/// <summary>
/// Fired when item has been added to the list
/// </summary>
public event ItemAddedEventHandler ItemAdded;
/// <summary>
/// Fired when list is cleared
/// </summary>
public event ListClearedEventHandler ListCleared;
public ObservableList()
{
internalList = new List<T>();
}
public ObservableList(IList<T> list)
{
internalList = list;
}
public ObservableList(IEnumerable<T> collection)
{
internalList = new List<T>(collection);
}
protected virtual void OnItemAdded(ListChangedEventArgs e)
{
if (ItemAdded != null)
ItemAdded(this, e);
}
protected virtual void OnItemRemoved(ListChangedEventArgs e)
{
if (ItemRemoved != null)
ItemRemoved(this, e);
}
protected virtual void OnListChanged(ListChangedEventArgs e)
{
if (ListChanged != null)
ListChanged(this, e);
}
protected virtual void OnListCleared(EventArgs e)
{
if (ListCleared != null)
ListCleared(this, e);
}
public int IndexOf(T item)
{
return internalList.IndexOf(item);
}
public void Insert(int index, T item)
{
internalList.Insert(index, item);
OnListChanged(new ListChangedEventArgs(index, item));
}
public void RemoveAt(int index)
{
T item = internalList[index];
internalList.Remove(item);
OnListChanged(new ListChangedEventArgs(index, item));
OnItemRemoved(new ListChangedEventArgs(index, item));
}
public T this[int index]
{
get { return internalList[index]; }
set
{
internalList[index] = value;
OnListChanged(new ListChangedEventArgs(index, value));
}
}
public void Add(T item)
{
internalList.Add(item);
OnListChanged(new ListChangedEventArgs(internalList.IndexOf(item), item));
OnItemAdded(new ListChangedEventArgs(internalList.IndexOf(item), item));
}
public void Clear()
{
internalList.Clear();
OnListCleared(new EventArgs());
}
public bool Contains(T item)
{
return internalList.Contains(item);
}
public void CopyTo(T[] array, int arrayIndex)
{
CopyTo(array, arrayIndex);
}
public int Count
{
get { return internalList.Count; }
}
public bool IsReadOnly
{
get { return IsReadOnly; }
}
public bool Remove(T item)
{
lock (this)
{
int index = internalList.IndexOf(item);
if (internalList.Remove(item))
{
OnListChanged(new ListChangedEventArgs(index, item));
OnItemRemoved(new ListChangedEventArgs(index, item));
return true;
}
else
return false;
}
}
public IEnumerator<T> GetEnumerator()
{
return internalList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable)internalList).GetEnumerator();
}
}
Initial URL
Initial Description
Initial Title
Observable List
Initial Tags
list
Initial Language
C#