WPF MVVM从BackgroundWorker更新UI绑定属性

时间:2010-09-30 20:01:14

标签: c# wpf mvvm

从Backgroundworker更新ViewModel的UI绑定属性是否存在任何潜在问题?我正在尝试在绑定到UI时更新VM,并且可能用户可能正在键入...同步如何工作(我不认为我可以使用XAML中的Lock语句)。

提前致谢..

2 个答案:

答案 0 :(得分:3)

更新标量属性时,您无需担心在UI线程上执行此操作。 PropertyChanged事件会自动编组到UI线程。

但是,对于实施INotifyCollectionChanged的集合,无效CollectionChanged事件不会被编组到UI线程,它将导致异常。因此,如果修改绑定到ItemsControl的集合,则需要使用Dispatcher.Invoke(或其他同步机制)在UI线程上执行此操作。另一种选择是使用专门的集合来处理将事件编组到正确的线程。有关此类集合的示例,请参阅this article

答案 1 :(得分:1)

根据我使用Silverlight的经验,尝试这样做会导致异常。

基本上,您需要从调度程序线程更新绑定属性,就像您直接修改UI一样。

为了让ViewModel在不知道实际Dispatcher的情况下这样做,我发现创建IDispatcher接口很有用,然后使用SameThreadDispatcher进行测试和一个SystemDispatcher(代表真实的东西)进行生产。然后,将IDispatcher作为依赖项传递给ViewModel。