using System; using System.Collections.Generic; using System.ComponentModel; namespace Be.Timvw.Framework.ComponentModel { public class FilterList : SortableBindingList { readonly List allItems = new List(); public FilterList() { } public FilterList(IEnumerable elements) : base(elements) { this.allItems.AddRange(elements); } public void Filter(Predicate filter) { if (ReferenceEquals(filter, null)) { throw new ArgumentNullException("filter"); } this.ApplyFilter(filter); if (this.IsSortedCore) { this.ApplySortCore(this.SortPropertyCore, this.SortDirectionCore); } OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); } protected virtual void ApplyFilter(Predicate filter) { var wantedItems = this.allItems.FindAll(filter); this.Items.Clear(); foreach (var item in wantedItems) { this.Items.Add(item); } } protected override void InsertItem(int index, T item) { base.InsertItem(index, item); allItems.Add(this[index]); } protected override void RemoveItem(int index) { allItems.Remove(this[index]); base.RemoveItem(index); } protected override void ClearItems() { base.ClearItems(); allItems.Clear(); } protected override void SetItem(int index, T item) { allItems[allItems.IndexOf(this[index])] = item; base.SetItem(index, item); } } }