This topic has not yet been rated - Rate this topic

IBindingList Interface

Provides the features required to support both complex and simple scenarios when binding to a data source.

Namespace:  System.ComponentModel
Assembly:  System (in System.dll)
public interface IBindingList : IList, 
	ICollection, IEnumerable

The IBindingList type exposes the following members.

  Name Description
Public property Supported by the XNA Framework AllowEdit Gets whether you can update items in the list.
Public property Supported by the XNA Framework AllowNew Gets whether you can add items to the list using AddNew.
Public property Supported by the XNA Framework AllowRemove Gets whether you can remove items from the list, using Remove or RemoveAt.
Public property Supported by the XNA Framework Count Gets the number of elements contained in the ICollection. (Inherited from ICollection.)
Public property Supported by the XNA Framework IsFixedSize Gets a value indicating whether the IList has a fixed size. (Inherited from IList.)
Public property Supported by the XNA Framework IsReadOnly Gets a value indicating whether the IList is read-only. (Inherited from IList.)
Public property Supported by the XNA Framework IsSorted Gets whether the items in the list are sorted.
Public property Supported by the XNA Framework IsSynchronized Gets a value indicating whether access to the ICollection is synchronized (thread safe). (Inherited from ICollection.)
Public property Supported by the XNA Framework Item Gets or sets the element at the specified index. (Inherited from IList.)
Public property Supported by the XNA Framework SortDirection Gets the direction of the sort.
Public property Supported by the XNA Framework SortProperty Gets the PropertyDescriptor that is being used for sorting.
Public property Supported by the XNA Framework SupportsChangeNotification Gets whether a ListChanged event is raised when the list changes or an item in the list changes.
Public property Supported by the XNA Framework SupportsSearching Gets whether the list supports searching using the Find method.
Public property Supported by the XNA Framework SupportsSorting Gets whether the list supports sorting.
Public property Supported by the XNA Framework SyncRoot Gets an object that can be used to synchronize access to the ICollection. (Inherited from ICollection.)
Top
  Name Description
Public method Supported by the XNA Framework Add Adds an item to the IList. (Inherited from IList.)
Public method Supported by the XNA Framework AddIndex Adds the PropertyDescriptor to the indexes used for searching.
Public method Supported by the XNA Framework AddNew Adds a new item to the list.
Public method Supported by the XNA Framework ApplySort Sorts the list based on a PropertyDescriptor and a ListSortDirection.
Public method Supported by the XNA Framework Clear Removes all items from the IList. (Inherited from IList.)
Public method Supported by the XNA Framework Contains Determines whether the IList contains a specific value. (Inherited from IList.)
Public method Supported by the XNA Framework CopyTo Copies the elements of the ICollection to an Array, starting at a particular Array index. (Inherited from ICollection.)
Public method Supported by the XNA Framework Find Returns the index of the row that has the given PropertyDescriptor.
Public method Supported by the XNA Framework GetEnumerator Returns an enumerator that iterates through a collection. (Inherited from IEnumerable.)
Public method Supported by the XNA Framework IndexOf Determines the index of a specific item in the IList. (Inherited from IList.)
Public method Supported by the XNA Framework Insert Inserts an item to the IList at the specified index. (Inherited from IList.)
Public method Supported by the XNA Framework Remove Removes the first occurrence of a specific object from the IList. (Inherited from IList.)
Public method Supported by the XNA Framework RemoveAt Removes the IList item at the specified index. (Inherited from IList.)
Public method Supported by the XNA Framework RemoveIndex Removes the PropertyDescriptor from the indexes used for searching.
Public method Supported by the XNA Framework RemoveSort Removes any sort applied using ApplySort.
Top
  Name Description
Public event Supported by the XNA Framework ListChanged Occurs when the list changes or an item in the list changes.
Top
  Name Description
Public Extension Method AsParallel Enables parallelization of a query. (Defined by ParallelEnumerable.)
Public Extension Method AsQueryable Converts an IEnumerable to an IQueryable. (Defined by Queryable.)
Public Extension Method Supported by the XNA Framework Cast<TResult> Converts the elements of an IEnumerable to the specified type. (Defined by Enumerable.)
Public Extension Method Supported by the XNA Framework OfType<TResult> Filters the elements of an IEnumerable based on a specified type. (Defined by Enumerable.)
Top

This interface is implemented by the DataView class. Implementation of a method should exhibit the same behavior as the implementation of that method in the DataView class.

When you call the ApplySort or RemoveSort methods, you should raise a ListChanged event with the Reset enumeration.

When you call the AddNew method, you should raise a ListChanged event with the ItemAdded enumeration carrying the appropriate index. The added row is in a state where pressing the ESC on a DataGridView control can remove the new row. Raising the ListChanged event with the ItemAdded enumeration a second time on this row indicates that the item is now a row not in the "new" state.

When you remove an item or call the CancelEdit method on a new row (if that row implements IEditableObject), you should raise a ListChanged event with the ItemDeleted enumeration carrying the appropriate index.

The following example provides a simple implementation of the IBindingList interface. The CustomerList class stores customer information in a list. This example assumes that you have used the Customer class that can be found in the example in the IEditableObject class.


	public class CustomersList :  CollectionBase, IBindingList
	{

		private ListChangedEventArgs resetEvent = new ListChangedEventArgs(ListChangedType.Reset, -1);
		private ListChangedEventHandler onListChanged;

		public void LoadCustomers() 
		{
			IList l = (IList)this;
			l.Add(ReadCustomer1());
			l.Add(ReadCustomer2());
			OnListChanged(resetEvent);
		}

		public Customer this[int index] 
		{
			get 
			{
				return (Customer)(List[index]);
			}
			set 
			{
				List[index] = value;
			}
		}

		public int Add (Customer value) 
		{
			return List.Add(value);
		}

		public Customer AddNew() 
		{
			return (Customer)((IBindingList)this).AddNew();
		}

		public void Remove (Customer value) 
		{
			List.Remove(value);
		}


		protected virtual void OnListChanged(ListChangedEventArgs ev) 
		{
			if (onListChanged != null) 
			{
				onListChanged(this, ev);
			}
		}


		protected override void OnClear() 
		{
			foreach (Customer c in List) 
			{
				c.Parent = null;
			}
		}

		protected override void OnClearComplete() 
		{
			OnListChanged(resetEvent);
		}

		protected override void OnInsertComplete(int index, object value) 
		{
			Customer c = (Customer)value;
			c.Parent = this;
			OnListChanged(new ListChangedEventArgs(ListChangedType.ItemAdded, index));
		}

		protected override void OnRemoveComplete(int index, object value) 
		{
			Customer c = (Customer)value;
			c.Parent = this;
			OnListChanged(new ListChangedEventArgs(ListChangedType.ItemDeleted, index));
		}

		protected override void OnSetComplete(int index, object oldValue, object newValue) 
		{
			if (oldValue != newValue) 
			{

				Customer oldcust = (Customer)oldValue;
				Customer newcust = (Customer)newValue;

				oldcust.Parent = null;
				newcust.Parent = this;

				
				OnListChanged(new ListChangedEventArgs(ListChangedType.ItemAdded, index));
			}
		}

		// Called by Customer when it changes.
		internal void CustomerChanged(Customer cust) 
		{
			
			int index = List.IndexOf(cust);

			OnListChanged(new ListChangedEventArgs(ListChangedType.ItemChanged, index));
		}


		// Implements IBindingList.
		bool IBindingList.AllowEdit 
		{ 
			get { return true ; }
		}

		bool IBindingList.AllowNew 
		{ 
			get { return true ; }
		}

		bool IBindingList.AllowRemove 
		{ 
			get { return true ; }
		}

		bool IBindingList.SupportsChangeNotification 
		{ 
			get { return true ; }
		}

		bool IBindingList.SupportsSearching 
		{ 
			get { return false ; }
		}

		bool IBindingList.SupportsSorting 
		{ 
			get { return false ; }
		}


		// Events.
		public event ListChangedEventHandler ListChanged 
		{
			add 
			{
				onListChanged += value;
			}
			remove 
			{
				onListChanged -= value;
			}
		}

		// Methods.
		object IBindingList.AddNew() 
		{
			Customer c = new Customer(this.Count.ToString());
			List.Add(c);
			return c;
		}


		// Unsupported properties.
		bool IBindingList.IsSorted 
		{ 
			get { throw new NotSupportedException(); }
		}

		ListSortDirection IBindingList.SortDirection 
		{ 
			get { throw new NotSupportedException(); }
		}


		PropertyDescriptor IBindingList.SortProperty 
		{ 
			get { throw new NotSupportedException(); }
		}


		// Unsupported Methods.
		void IBindingList.AddIndex(PropertyDescriptor property) 
		{
			throw new NotSupportedException(); 
		}

		void IBindingList.ApplySort(PropertyDescriptor property, ListSortDirection direction) 
		{
			throw new NotSupportedException(); 
		}

		int IBindingList.Find(PropertyDescriptor property, object key) 
		{
			throw new NotSupportedException(); 
		}

		void IBindingList.RemoveIndex(PropertyDescriptor property) 
		{
			throw new NotSupportedException(); 
		}

		void IBindingList.RemoveSort() 
		{
			throw new NotSupportedException(); 
		}

		// Worker functions to populate the list with data.
		private static Customer ReadCustomer1() 
		{
			Customer cust = new Customer("536-45-1245");
			cust.FirstName = "Jo";
			cust.LastName = "Brown";
			return cust;
		}

		private static Customer ReadCustomer2() 
		{
			Customer cust = new Customer("246-12-5645");
			cust.FirstName = "Robert";
			cust.LastName = "Brown";
			return cust;
		}
	}



.NET Framework

Supported in: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
Did you find this helpful?
(1500 characters remaining)
Community Content Add
Annotations FAQ
OnRemoveComplete Method Should Set c.Parent = null Instead of this ?
The OnRemove complete method in the above example sets c.Parent = this. Shouldn't it set c.Parent = null?
Example code - onListChanged event private?
Just a comment on the example code: Does it make sense to have the onListChanged event private? I always thought that events are interfaces to the 'outside world'...
 - Sorry, the public OnListChanged is a little bit further down. I should have read to the end first.
MSDN Copy (Code) Button did not work properly in Chrome
MSDN Copy (Code) Button did not work properly in Chrome