2011-08-19 54 views
0

我在Windows Phone 7中有一個錄音應用程序。 該應用程序允許用戶播放錄製的聲音。VisualState綁定線程問題

我儘量堅持使用MVVM指南。

我在所有錄音列表中有一個播放/停止按鈕。每個錄音都有自己的ViewModel,除此之外,它還控制相應的播放/停止按鈕的外觀。

該按鈕具有在其樣式中定義的自定義視覺狀態。

的可視狀態是使用方法綁定到視圖模型的屬性,如下所示: http://tdanemar.wordpress.com/2009/11/15/using-the-visualstatemanager-with-the-model-view-viewmodel-pattern-in-wpf-or-silverlight/

已經實現了這個方法,每當我想改變戲的樣子/停止按鈕,我需要設置公共字符串屬性(命名爲「PlayStopVisualState」)在我的ViewModel「PlayingState」或「正常」,並將分配一個適當的視覺狀態,我的按鈕。

問題是,當用戶按下播放按鈕時,會在後臺線程中創建SoundEffectInstance,後臺線程播放聲音。線程然後等待播放結束。當錄製播放結束時(我必須在同一個後臺線程中跟蹤它,或者創建另一個用於跟蹤SoundEffectInstance.State),我將PlayStopVisualState屬性重新設置爲「Normal」,但我得到了一個跨線程引用異常。 MVVM是否專門設計用於允許開發人員在視圖模型中操作邏輯變量,而不必擔心View的變化如何反映在視圖中?

我知道我需要對Dispatcher線程中的PlayStopVisualState屬性進行調整,以便問題消失,但這是不對的。從我的角度來看,它擊敗了MVVM的全部目的,只留下組織優勢。

或者我做錯了什麼?謝謝。

更新: 我以

Deployment.Current.Dispatcher 

解決該問題的工作,但在我看來,作爲一個非常「醜陋」的解決方案,因爲我幾乎全身都MVVM模式緊隨其後。

+0

'每個錄音都有自己的ViewModel'不應該是一個模型嗎? – jv42

+0

它可以是任何方式的邏輯。例如,電話頁面最有可能具有一個視圖模型和它依賴於UI的不同模型。但是當我們有一個控件的視圖模型時,例如每個列表項都可以在邏輯上擁有自己的視圖模型。就我個人而言,我並不認爲這是一種誤解。 –

+0

我並不是說這是錯的,它似乎有點奇怪,所以我想知道它是否是一個錯字。 – jv42

回答

1

使用Dispatcher反映UI綁定值是正確的方法。

你忘記了你的ViewModel是在UI線程上創建的。因此,從後臺線程對ViewModel進行的任何更改都會進行跨線程操作。

您應該考慮是否真的需要後臺線程。 ,或者您可以直接在UI線程上安排您的操作。

+0

謝謝。順便說一句,我該如何在UI線程上安排一個動作? –

+0

'Dispatcher.BeginInvoke'在UI線程上調度動作。這是調度員的整個想法;-) –

+0

嗯,問題是你必須有一個UI調度器的實例。在我的情況下,我沒有其他的方式來定位它,除了Deployment.Current.Dispatcher。這是引用UI線程調度程序的正確方法嗎? –