2012-02-21 30 views
0

我有一個使用MVVM的應用程序。我正在嘗試攔截MCE遙控器上的按鍵以播放,暫停,停止等。 目前,我正在使用命令綁定與代碼中的某個方法執行媒體元素上的相關操作,如有沒有比在後面的代碼中處理CommandBindings更好的方法?

<Window.CommandBindings> 
    <CommandBinding Command="MediaCommands.Play" Executed="PlayMediaElement"/> 
    <CommandBinding Command="MediaCommands.Stop" Executed="StopMediaElement"/> 
</Window.CommandBindings> 

努力包括遠程控制功能我有大約10視圖模式/有沒有在後面的代碼視圖之前。 我想知道是否有更好的方法來做到這一點,所以我保留MVVM模式,或者是完全可以接受/可以用這種方式實現。

編輯 - 我已經將命令綁定從視圖內的用戶控件移到我的MainWindow.xaml中,並將這些方法放置到MainWindow.xaml.cs中。 MainWindow沒有視圖/視圖模型關係,只是一個ViewModel鏈接到它的內容控件。 在我的代碼背後的方法,我正在使用中介發送消息(播放,暫停,停止等...)到我的mediaplayerviewmodel,它反過來交互與它的相應的看法。這是一個好主意還是有更好的方法?

+0

[如何找到綁定錯誤的來源?](http://stackoverflow.com/a/8480651/485076) – sll 2012-02-21 19:19:27

回答

1

我認爲約什史密斯在他2009年的文章中創造了一個巨大的混亂,當時他提出了一個觀點,即他的代碼隱藏CS文件基本上是空的。 MVVM並不是沒有代碼隱藏。這是關於分離問題。如果有什麼實際的規則你應該遵循,就是使ViewModel視圖不可知(即沒有從ViewModel引用到視圖,認爲你的ViewModel有一個'View'的第二個單元測試實現)。

這種「沒有代碼背後」的混亂導致非常奇怪的結構只是爲了解決一個本來不應該存在的問題。

在MainWindow.xaml.cs中隱藏代碼是非常合理的解決方案,只要您沒有邏輯,只需將調用轉發到View Model中的適當方法即可。如果這是我的代碼,我會創建自定義命令(來自同一篇文章的la DelegateCommand),直接綁定到ViewModel中的命令,但是您的設計也是100%合法的。

+0

Actualy不,它是股票的限制WPF。股票WPF無法在視圖或控制器上定義明智的調用方法。 – TomTom 2012-02-23 09:56:02

+1

不確定爲什麼這被標記?我已經根據最後一段提出瞭解決方案。我已經創建了自定義的路由命令,它們可以冒泡到主窗口(沒有視圖),但是會操作視圖模型。 – Oli 2012-02-27 11:25:42

0

轉向Codeplex.com並尋找Caliburn(或更好的Caliburn Micro)。它擴展了WPF以實際允許調用具有從其他對象拉取的任意參數的方法,並且該方法位於視圖模型/控制器中,而不會在代碼後面有一個「鉤子方法」,只是在調用該方法之後。

擴展可以做到奇妙thignsl ike拉取文本框的值並將其作爲參數傳遞給方法,然後對返回值作出反應 - 很像視圖應該。

您運行的是「stock」wpf的限制 - 只能指向代碼後面的方法處理程序,而不考慮參數。存在異常,甚至來自微軟。

相關問題