wpf MVVM ObservableCollection

时间:2011-06-12 18:25:25

标签: wpf multithreading mvvm observablecollection

我的模型有一些属性,一个是字符串,另一个是observablecolletion。创建模型时,它会触发后台工作线程,以基本上轮询.dll中的数据。根据它收到的数据,它将设置字符串和/或添加和项目到可观察的集合。我的字符串属性似乎触发其Onproperty更改就好了,视图更新。但是,我的observable Collection会抛出一个跨线程异常。我已经尝试移动代码,我将ObesrvableCollection设置为worker.ReportProgress并获得相同的错误。我已将逻辑移动到视图模型中,仍然得到相同的线程错误。我不确定为什么我的字符串属性适用于一个。我已经阅读了Dispatcher.Invoke,但我很确定我的模型不应该知道这一点。任何人都可以解释正确的方法来解决这个问题。

只是fyi - 我的观点并不直接与我的模特联系在一起。我在我的viewModel中有我的模型的属性,模型通过构造函数注入传递。在任何人认为我的模型直接与视图对话之前,只想把它放在那里。

2 个答案:

答案 0 :(得分:1)

很难在没有代码的情况下提供细节。但是,WPF会自动为标量属性而不是集合封送属性更改通知。因此,您必须从非UI线程修改集合。

没有理由说您的VM无法使用Dispatcher,或者如果您愿意,也可能使用更通用的SynchronizationContext。但是,它可以使测试更加棘手。

如果您发布代码,可能有一种方法可以简化事情。

答案 1 :(得分:1)

正如肯特所说,如果您不在用户界面上,则需要使用Dispatcher来更新您的收藏集:

Application.Current.Dispatcher.Invoke(new Action(() =>
{
    // update your ObservableCollection here
}));