public ObservableGroupCollection(IGroupingCollection <K, T> item, Func <K, K, bool> equalityComparer) { _equalityComparer = equalityComparer; if (item != null) { foreach (T t in item) { SetupPropertyChanged(t, equalityComparer); } } }
void SetupPropertyChanged(T propChangeItem, Func <K, K, bool> equalityComparer) { propChangeItem.PropertyChanged += (sender, e) => { if (e.PropertyName == "SortingKey") { //using (BlockReentrancy()) { T changedItem = (T)sender; IGroupingCollection <K, T> oldGroup = null, newGroup = null; foreach (var group in Items) //go through all groups to find item { if (oldGroup == null /* || newGroup == null*/) { foreach (var item2 in group) { if (oldGroup == null && item2 == changedItem) { oldGroup = group; } } } if (newGroup == null && equalityComparer(group.Key, changedItem.SortingKey)) { newGroup = group; } } if (oldGroup != null) { oldGroup.Remove(changedItem); if (oldGroup.Count == 0) { OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, oldGroup)); Items.Remove(oldGroup); } } #if DEBUG else { throw new Exception("oldGroup == null"); } #endif if (newGroup == null) { Items.Add(newGroup = new Grouping <K, T> (changedItem.SortingKey, changedItem)); OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, newGroup)); } else { foreach (var item in newGroup) { if (item == changedItem) { return; } } newGroup.Add(changedItem); } } } }; }