WPF MVVM:如何从BackgroundWorker更新UI绑定属性

7
有没有可能在Backgroundworker中更新ViewModel的UI绑定属性存在潜在问题?我正在尝试在VM与UI绑定时更新VM,而且可能用户正在输入...这里的同步如何工作(我不认为我可以从XAML中使用Lock语句)。
提前感谢。
2个回答

4
更新标量属性时,您不需要担心在UI线程上执行此操作。 PropertyChanged 事件会自动转移到UI线程。
但是,如果要修改实现INotifyCollectionChanged的集合,则不会在UI线程上转移CollectionChanged 事件,这将导致异常。因此,如果您修改绑定到 ItemsControl的集合,则需要使用 Dispatcher.Invoke(或另一种同步机制)来在UI线程上执行它。另一种选择是使用专门处理将事件转移到正确线程的集合。有关此类集合的示例,请参见 此文章

我正在使用Josh Einstein的AddOnUI(https://dev59.com/03I95IYBdhLWcg3w7CjL)来更新集合。但我主要关注MVVM中的<Model>对象属性,该属性反过来又提供了ViewModel的其他属性。 - Bhuvan

1

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

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

为了使ViewModel能够在不知道真正的Dispatcher的情况下执行此操作,我发现创建一个IDispatcher接口非常有用,然后为测试使用SameThreadDispatcher,而为生产使用委托给真实对象的SystemDispatcher。然后将IDispatcher作为依赖项传递给ViewModel。


我不了解Silverlight,但在WPF中,您可以在工作线程上更新ViewModel属性而不会出现问题,但集合必须在UI线程上修改...(有关详细信息,请参见我的答案) - Thomas Levesque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接