C# 为什么';t分配到ObservableCollection销毁CollectionChanged订户列表?
我有一个可观的收集,我需要通过重新加载按钮来更换。在尝试此过程中,我发现CollectionChanged事件会激发,即使变量“myCollection”在“ReLoadData”中为空(请参见下面的代码示例),并分配了一个新的ObservableCollection,其中我没有向其CollectionChanged成员添加任何事件处理程序:C# 为什么';t分配到ObservableCollection销毁CollectionChanged订户列表?,c#,variable-assignment,observablecollection,inotifycollectionchanged,C#,Variable Assignment,Observablecollection,Inotifycollectionchanged,我有一个可观的收集,我需要通过重新加载按钮来更换。在尝试此过程中,我发现CollectionChanged事件会激发,即使变量“myCollection”在“ReLoadData”中为空(请参见下面的代码示例),并分配了一个新的ObservableCollection,其中我没有向其CollectionChanged成员添加任何事件处理程序: public partial class MainWindow : Window { private Observable
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");
}
}
公共部分类主窗口:窗口
{
私有可观测集合myCollection=
新的可观察集合();
公共主窗口()
{
初始化组件();
myCollection.CollectionChanged+=新建
System.Collections.Specialized.NotifyCollectionChangedEventHandler(
myCollection_CollectionChanged);
}
//在按钮单击处理程序中调用:
私有void重载数据()
{
可观测集合新集合=
新的可观察集合();
//用东西填充新收藏。。。
//标记垃圾收集器的旧收集
myCollection=null;
myCollection=新集合;
}
void myCollection\u collection已更改(
对象发送器,
System.Collections.Specialized.NotifyCollectionChangedEventArgs(e)
{
//在语句或其中一个大括号上设置断点。
}
私有void附加项(对象发送方、RoutedEventArgs参数)
{
//为什么以下fire Collections发生了变化
//虽然myCollection在年被取消了
//是否在之前重新加载AuctionData()?
myCollection.Add(“AddedItem”);
}
}
我怀疑这可能与赋值运算符在C#中的实现方式有关,但据我所知,它不能在C#中重写,因此我不知道如何解释上述行为。。。有人知道吗?(从评论中)
我怀疑,无论是谁“填充”了这个收藏,他仍然是一个艺术家 已连接到旧的“集合”
i、 e.无论INotifyCollectionChanged如何,这只是针对内部集合-您仍然需要“通知”任何“订阅者”整个集合已经更改-以及使用INotifyPropertyChanged-即在该“anulling”(这是不必要的)上。
您需要调用PropertyChanged(“集合”)或者叫什么名字
都很奇怪。确实在单击按钮时调用了ReLoadData()方法吗?我刚刚复制了这段代码并将其添加到构造函数中:myCollection.Add(“lalala”);重新加载数据();myCollection.Add(“bobo”)代码>。并且您的处理程序不会在第二个Add
方法上调用。我认为您的按钮单击处理程序中存在一些错误。我怀疑无论是谁“填充”集合,都仍然连接到旧的“集合”——即,无论INotifyCollectionChanged是什么,这仅适用于内部集合-您仍然需要“通知”任何“订阅者”整个集合已更改-并且使用INotifyPropertyChanged-即,在该“anulling”(这是不必要的)上,您需要调用PropertyChanged(“collection”)或任何名称。