VisualState绑定线程问题

时间:2011-08-19 18:56:10

标签: silverlight windows-phone-7 mvvm multithreading

我在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模式。

1 个答案:

答案 0 :(得分:1)

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

您忘记的是您的ViewModel是在UI线程上创建的。因此,从后台线程对ViewModel的任何更改都会进行跨线程操作。

您应该考虑是否真的需要后台线程。 ,或者如果你可以直接在UI线程上安排你的行动。