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项。
我在这里可能会遗漏一个常见的陷阱吗?兔子洞越深,我就越深入挖掘它。
答案 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;
}
}