in sources/Google.Solutions.Mvvm/Controls/BindableListView.cs [253:335]
private void Model_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
AddViewItems(e.NewItems.OfType<TModelItem>());
break;
case NotifyCollectionChangedAction.Remove:
foreach (var oldModelItem in e.OldItems.OfType<TModelItem>())
{
var oldViewItem = FindViewItem(oldModelItem);
if (oldViewItem != null)
{
UnobserveItem(oldModelItem);
this.Items.Remove(oldViewItem);
}
}
break;
case NotifyCollectionChangedAction.Replace:
if (e.OldItems.Count == e.NewItems.Count)
{
var count = e.OldItems.Count;
for (var i = 0; i < count; i++)
{
var oldModelItem = (TModelItem)e.OldItems[i];
var newModelItem = (TModelItem)e.NewItems[i];
var viewItem = FindViewItem(oldModelItem);
if (viewItem != null)
{
UnobserveItem(oldModelItem);
ObserveItem(newModelItem);
viewItem.Tag = newModelItem;
foreach (ColumnHeader column in this.Columns)
{
viewItem.SubItems[column.Index].Text =
ExtractColumnValue(column.Index, newModelItem);
}
}
}
}
break;
case NotifyCollectionChangedAction.Move:
foreach (var oldItem in e.OldItems.OfType<TModelItem>())
{
var viewItem = FindViewItem(oldItem);
if (oldItem != null)
{
this.Items.Remove(viewItem);
this.Items.Insert(e.NewStartingIndex, viewItem);
}
}
break;
case NotifyCollectionChangedAction.Reset:
// Reload everything.
UnobserveItems(this.Items.Cast<ListViewItem>()
.Select(i => i.Tag)
.OfType<TModelItem>());
this.Items.Clear();
AddViewItems(this.model.EnsureNotNull());
break;
default:
break;
}
if (this.AutoResizeColumnsOnUpdate)
{
AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
}
}