【发布时间】: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") 或任何名称。
标签: c# variable-assignment observablecollection inotifycollectionchanged