绑定线程问题



我在Windows Phone 7中有一个音频录制应用程序。该应用程序允许用户播放录制的声音。

在可能的情况下,我尽量坚持MVVM指南。

我在所有录音列表中有一个播放/停止按钮。每个录音都有自己的ViewModel,除此之外,它还控制相应的播放/停止按钮的外观。

按钮有一个自定义的视觉状态。

使用如下方法将Visual State绑定到ViewModel的属性:http://tdanemar.wordpress.com/2009/11/15/using-the-visualstatemanager-with-the-model-view-viewmodel-pattern-in-wpf-or-silverlight/

实现这种方法后,每当我想改变播放/停止按钮的外观时,我需要在我的ViewModel中设置公共字符串属性(名为"PlayStopVisualState")为"PlayingState"或"Normal",这将为我的按钮分配适当的视觉状态。

问题是,当用户按下播放按钮时,在后台线程中创建了一个SoundEffectInstance,它播放声音。然后线程等待播放结束。当录音播放结束时(我必须在相同的背景线程中跟踪它,或者创建另一个只跟踪SoundEffectInstance.State),我将PlayStopVisualState属性设置回"Normal",但我得到一个跨线程引用异常。MVVM不是专门设计来允许开发人员在视图模型中操作逻辑变量,而不必担心对它们的更改如何反映在视图中吗?

我知道我需要在Dispatcher线程中做PlayStopVisualState属性的调整,以使问题消失,但这是不对的。在我看来,它违背了MVVM的全部目的,只留下了组织上的优势。

还是我做错了什么?谢谢。

更新:我已经通过使用

解决了这个问题
Deployment.Current.Dispatcher

但是对我来说,这似乎是一个非常"丑陋"的解决方案,因为我几乎所有的MVVM模式都遵循

使用Dispatcher来反映ui绑定值是正确的方法,是的。

你忘记的是你的ViewModel是在UI线程上创建的。所以后台线程对ViewModel的任何改变,都是一个跨线程的操作。

你应该考虑是否真的需要一个后台线程。或者你可以直接在UI线程上安排你的动作

最新更新