public static void BindDataSource(this BetterListViewItem item, TaskListViewSourceItem source, BetterListView owner) { item.Tag = source; Refresh(item, owner); item.Group = source.Group; }
private static void Refresh(BetterListViewItem item, BetterListView owner) { TaskListViewSourceItem source = item.DataSource(); object dataObject = source.DataObject; IEnumerable <BetterListViewColumnHeader> columns = owner.Columns; Dictionary <string, PropertyInfo> props = GetDataObjectProps(dataObject); int colCount = columns.Count(), subCount = item.SubItems.Count, subDiff = colCount - subCount; if (subDiff > 0) { List <BetterListViewSubItem> subItems = new List <BetterListViewSubItem>(subDiff); for (int i = 0; i < subDiff; i++) { subItems.Add(new BetterListViewSubItem()); } item.SubItems.AddRange(subItems); } int idx = -1; foreach (BetterListViewColumnHeader column in columns) { idx++; if (column.DisplayMember == string.Empty || !props.TryGetValue(column.DisplayMember, out var propertyInfo)) { continue; } BetterListViewSubItem subItem = item.SubItems[idx]; object displayValue = propertyInfo.GetValue(dataObject); string displayString = displayValue?.ToString(); if (subItem.Text != displayString) { subItem.Text = displayString; } if (column.ValueMember != string.Empty && props.TryGetValue(column.ValueMember, out propertyInfo)) { subItem.Key = (IComparable)propertyInfo.GetValue(dataObject); } else { subItem.Key = (IComparable)displayValue; } } }
public void RebindItems() { BeginUpdate(); HashSet <object> setItems = _sourceItems != null ? new HashSet <object>(_sourceItems) : new HashSet <object>(); BetterListViewItem[] toDelete = Items. Where(i => !setItems.Contains(i.DataObject())). ToArray(); foreach (BetterListViewItem item in toDelete) { Items.Remove(item); } BetterListViewItem[] toUpdate = Items. Where(i => setItems.Contains(i.DataObject())). ToArray(); foreach (BetterListViewItem item in toUpdate) { item.Refresh(); } IEnumerable <object> toAdd = setItems.Except(Items.Select(i => i.DataObject())); List <BetterListViewItem> itemsToAdd = new List <BetterListViewItem>(); foreach (object dataObject in toAdd) { BetterListViewItem item = new BetterListViewItem(); TaskListViewSourceItem source = new TaskListViewSourceItem(dataObject, _funcItemFindGroup); item.BindDataSource(source, this); itemsToAdd.Add(item); } Items.AddRange(itemsToAdd); EndUpdate(); }