为啥分配给 ObservableCollection 不会破坏 CollectionChanged 订阅者列表?
Posted
技术标签:
【中文标题】为啥分配给 ObservableCollection 不会破坏 CollectionChanged 订阅者列表?【英文标题】:Why doesn't assignment to ObservableCollection destroy CollectionChanged subscribers list?为什么分配给 ObservableCollection 不会破坏 CollectionChanged 订阅者列表? 【发布时间】:2013-03-21 20:28:25 【问题描述】:我有一个 ObservableCollection,我需要通过重新加载按钮来替换它。在尝试这个过程中,我发现即使变量“myCollection”在“ReLoadData”中被取消(参见下面的代码示例)并分配了一个新的 ObservableCollection,但我没有向其 CollectionChanged 成员添加任何事件处理程序,CollectionChanged 事件也会触发:
public partial class MainWindow : Window
private ObservableCollection<string> myCollection =
new ObservableCollection<string>();
public MainWindow()
InitializeComponent();
myCollection.CollectionChanged += new
System.Collections.Specialized.NotifyCollectionChangedEventHandler(
myCollection_CollectionChanged);
//Invoked in button click handler:
private void ReLoadData()
ObservableCollection<string> newCollection =
new ObservableCollection<string>();
//Filling newCollection with stuff...
//Marks old collection for the garbage collector
myCollection = null;
myCollection = newCollection;
void myCollection_CollectionChanged(
object sender,
System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
//Set breakpoint on statement or one of the braces.
private void AddItem(object sender, RoutedEventArgs args)
//Why does the following fire CollectionChanged
//although myCollection was nullified in
//ReLoadAuctionData() before?
myCollection.Add("AddedItem");
我怀疑这可能与赋值运算符在 C# 中的实现方式有关,但据我所知,它不能在 C# 中被覆盖,所以我不知道如何解释上述行为......有人知道吗?
【问题讨论】:
这很奇怪。你确定你真的在按钮点击时调用 ReLoadData() 方法吗?我刚刚复制了这段代码并将其添加到构造函数中:myCollection.Add("lalala"); ReLoadData(); myCollection.Add("bobobo");
。而且您的处理程序不会在第二个 Add
方法上调用。我认为您的按钮单击处理程序中有一些错误..
我怀疑谁在“填充”集合 - 仍然连接到旧的“集合” - 即不管 INotifyCollectionChanged,这只是用于内部集合 - 你仍然需要“通知” '整个'集合已更改的任何'订阅者' - 以及使用 INotifyPropertyChanged - 即在那个'取消'(这是不必要的顺便说一句。)你需要调用 OnPropertyChanged("Collection") 或任何名称。
【参考方案1】:
(来自评论)
我怀疑“填充”收藏的人仍然是 连接到旧的“集合”
即不管INotifyCollectionChanged, that's just for inside collection
如何-您仍然需要“通知”任何“订阅者”“整个”集合已更改-并且使用INotifyPropertyChanged-即在“取消”上(顺便说一句,这是不必要的。)@ 987654322@。
【讨论】:
以上是关于为啥分配给 ObservableCollection 不会破坏 CollectionChanged 订阅者列表?的主要内容,如果未能解决你的问题,请参考以下文章
为啥自定义子查询类型不能分配给 GraphQLObjectType?
为啥将 UICollectionViewLayout 分配给 UICollectionView 后 UICollectionViewCells 不再可见?