ObservableCollection的CollectionChanged事件似乎没有触发 - 为什么?

5
这段代码有什么问题?点击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个回答

10

你在字段初始化器中向原始的ObservableCollection实例添加了事件处理程序。
你从表单中没有向新的ObservableCollection实例添加事件处理程序。
由于原始的ObservableCollection从未更改,因此你的处理程序永远不会运行。

这是集合属性应该是只读的(以及它们应该是属性,而不是字段)的许多原因之一。


2
@ispiro:确切地说。 它仅在您修改原始ObservableCollection时触发,而不是在您替换它之后触发。 - SLaks
1
将集合设置为只读模式揭示了重新分配,并使我免受许多头疼之苦。 - Mert Akcakaya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接