我有一个可观察的集合... SelectableDataContext<T> ..并且在通用类SelectableDataContext<T>中...具有两个私有(private)成员变量

  • 私有(private)T物品。
  • 已选择私有(private) bool 。

  • 当IsSelected属性更改时...我收藏的更改后的属性未触发。

    我认为应该触发...因为它是Reset中的INotifyCollectionChangedAction

    最佳答案

    这是一个古老的问题,但对于任何可能像我一样通过搜索遇到此问题的人来说都是如此:
    NotifyCollectionChangedAction.Reset的意思是“集合的内容发生了巨大变化”。当您在基础可观察集合上调用Clear()时,引发Reset事件的一种情况。

    使用Reset事件,您不会在NewItems参数中获得OldItemsNotifyCollectionChangedEventArgs集合。

    这意味着您最好使用事件的“发送者”来获取对修改后的集合的引用,并直接使用该引用,即假定它是一个新列表。

    例如:

    ((INotifyCollectionChanged)stringCollection).CollectionChanged += new NotifyCollectionChangedEventHandler(StringCollection_CollectionChanged);
      ...
    
    void StringCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        switch (e.Action)
        {
            case NotifyCollectionChangedAction.Add:
                foreach (string s in e.NewItems)
                {
                    InternalAdd(s);
                }
                break;
    
            case NotifyCollectionChangedAction.Remove:
                foreach (string s in e.OldItems)
                {
                    InternalRemove(s);
                }
                break;
    
            case NotifyCollectionChangedAction.Reset:
                ReadOnlyObservableCollection<string> col = sender as ReadOnlyObservableCollection<string>;
                InternalClearAll();
                if (col != null)
                {
                    foreach (string s in col)
                    {
                        InternalAdd(s);
                    }
                }
                break;
        }
    }
    

    有关此Reset事件的大量讨论在这里:When Clearing an ObservableCollection, There are No Items in e.OldItems

    关于wpf - 什么是notifycollectionchangedaction重置值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4495904/

    10-14 16:31