Readonly ObservableCollection神秘地添加了一个元素

时间:2016-06-09 14:35:45

标签: c# wpf mvvm

C#应用程序,WPF,MVVM模型

所以我有一个ObservableCollection 项目。 项目没有定义setter,只有getter,它调用服务从支持此应用程序的DB获取新的集合。

现在在页面的viewmodel中我们有类似的内容:

{
    Public viewmodel(){
    items.CollectionChanged += CollectionChangedEvent;
    List<item> display = new List<item>;
    }

    private void CollectionChangedEvent(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e){
    updateDisplay();
    }

    private void updateDisplay(){
         display.clear();
         foreach(item i in items){
             display.add(i);
         }
    }
}

因此,当用户按下更新项目内元素的按钮时,它变得棘手。事件处理程序被调用,然后以某种方式项目获得添加的项目的附加相同副本,然后事件处理程序再次被调用两次,再次更新显示,但这次没有更改项目。现在显示屏上有两个相同的项目。事实上,如果您更改其中一个项目,则另一个项目会随之更改。

如果我删除事件处理程序并仅手动更新显示,则它可以正常工作,updateDisplay不会更改observablecollection项。

我在这里可能会遗漏一个常见的陷阱吗?兔子洞越深,我就越深入挖掘它。

1 个答案:

答案 0 :(得分:1)

对我而言,这听起来像是一个线程问题。事件处理程序可以从不同的线程调用,所以它听起来像你的&#34; items&#34;和&#34;显示&#34;项目未正确同步。

尝试以下方法:

private Object _lock = new Object();

private void CollectionChangedEvent(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    updateDisplay();
}

private void updateDisplay()
{
    lock (_lock)
    {
        items.CollectionChanged -= CollectionChangedEvent;

        display.clear();

        foreach(item i in items)
        {
            display.add(i);
        }

        items.CollectionChanged += CollectionChangedEvent;
    }
}