예제 #1
0
 public ObservableGroupCollection(IGroupingCollection <K, T> item, Func <K, K, bool> equalityComparer)
 {
     _equalityComparer = equalityComparer;
     if (item != null)
     {
         foreach (T t in item)
         {
             SetupPropertyChanged(t, equalityComparer);
         }
     }
 }
예제 #2
0
        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);
                        }
                    }
                }
            };
        }