ObservableCollection CollectionChanged事件似乎没有被解雇 - 为什么?

时间:2011-10-30 22:46:50

标签: c# .net-4.0 observablecollection

这段代码有什么问题?单击button1不会导致出现messageBox。

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也是如此。但点击button1后 - 没有人会再点火了。怎么样?

1 个答案:

答案 0 :(得分:10)

您已从字段初始值设定项向原始ObservableCollection实例添加了事件处理程序 您从未向表单中的新ObservableCollection实例添加事件处理程序 由于原始ObservableCollection永远不会更改,因此您的处理程序永远不会运行。

这是collection properties should be read only(和they should be properties, not fields

的众多原因之一