2011-10-30 115 views
5

有什么不对的代码?单击button1不会导致消息框出现。的ObservableCollection CollectionChanged事件似乎并没有被解雇 - 为什么?

public partial class Form1 : Form 
{ 
    public ObservableCollection<string> aCollection2 = new ObservableCollection<string>(); 
    myClass mc = new myClass(); 

    public Form1() 
    { 
     InitializeComponent(); 

     aCollection2.Add("a"); 
     aCollection2.Add("b"); 
    } 


    private void button1_Click(object sender, EventArgs e) 
    { 
     mc.myCollection = aCollection2; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     mc.myCollection.Clear(); 
    } 
} 

随着MyClass的定义:

class myClass 
{ 
    public ObservableCollection<string> myCollection = new ObservableCollection<string>(); 

    public myClass() 
    { 
     myCollection.CollectionChanged += Changed; 
    } 

    void Changed(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     MessageBox.Show(myCollection.Count.ToString()); 
    } 
} 

编辑: 当我添加第三个按钮有:

private void button3_Click(object sender, EventArgs e) 
{ 
    mc.myCollection.Add("a"); 
} 

它显示在MessageBox。 button2也是如此。但是在点击按钮1之后 - 没有人会再开火了。怎么来的?

回答

10

您从字段初始添加的事件处理程序到原来的ObservableCollection实例。
您从未从窗体添加事件处理程序到新的ObservableCollection实例。
由于原ObservableCollection永远不会改变,你的处理从来没有运行。

这是众多原因collection properties should be read only(和they should be properties, not fields

+0

见编辑之一。它在某些情况下会引发火灾。 – ispiro

+2

@ispiro:没错。只有当你修改** **原来'ObservableCollection',则在更换后不火。 – SLaks

+1

使集合只读显示重新分配,并从很多头痛救了我。 –