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