2010-10-21 49 views
3

我最近一直在使用Silverlight 4的MVVM light工具箱。EventToCommand是否傳遞EventArgs不良做法?

我真的很喜歡包含EventToCommand行爲,它使生活變得更容易。我一直在想的一件事是,如果設置PassEventArgsToCommand="True"是不好的做法,因爲它會將特定的RelayCommand與View中的特定事件關聯起來。

E.g.如果我的RelayCommand被定義爲:

public RelayCommand<System.Windows.Input.KeyEventArgs> myCommand 

然後,這隻能由KeyUp,KeyDown等事件調用。

我以爲ViewModel是沒有UI知識(例如暴露一個布爾轉換器,並使用轉換器將其改變爲可見性),不PassEventArgsToCommand打破這個?

+2

我在這個問題上與你在那裏......當它只是基於ViewModel進行某些操作時(例如按鈕),命令就很好,並且很漂亮,但是當您在UI中討論基於上下文的事件時(例如點擊鼠標時的位置),這並不會引起我的注意作爲一個不知道的ViewModel。 – 2011-06-08 19:51:52

回答

0

將視圖模型與視圖分離的一種方法是使用「代理」 - 介於兩者之間的通信。我已經使用MVVMLight的Messenger類來實現消息代理,並獲得了很好的結果。

HTH,indyfromoz

+0

所以,你會把RelayCommand放在一個獨立的類中,而不是ViewModel,並從那裏調用RelayCommand? – Fermin 2010-10-21 12:03:43

1

視圖模型是視圖,以便在那裏你指的聲明,認爲必須或數據應該代表則視圖模型應該處理它的模型。

使用可見性枚舉來表示視圖的哪個部分應該被視爲與視圖的狀態有關是合理的。

至於KeyEventArgs,它來自用戶的一個動作,並表示該命令的某些狀態,如果您需要知道按下了哪個鍵,那麼ViewModel處理的合理期望。

如果您引入更多抽象和複雜性來移除此事件arg,那麼您可能有將來的維護問題,前提是您可以使用此命令對其進行單元測試。

唯一我不會使用Visibility或KeyEventArgs等的時候,如果我想爲其他UI技術使用相同的ViewModel。如果這是你的情況,那麼我會創建抽象(儘管在我的經驗中這很少見,並且通常會涉及他們自己的ViewModel)。

1

如果要單元測試ViewModel,即將要將KeyEventArgs作爲參數調用的命令,將KeyEventArgs直接傳遞給ViewModel可能不是一個好主意。

原因是您無法在Silverlight中實例化KeyEventArgs(至少不會像我所見),因爲KeyEventArgs在Silverlight中沒有公共構造函數。

這意味着您無法從單元測試中傳遞密鑰。在這種情況下,將特定鍵映射到視圖/ XAML中的命令可能會更好,而不僅僅是使用EventDrigger作爲KeyDown事件。

將此視爲一個解決方案 - 它提供了一個KeyEventToCommand類,它允許您將鍵直接映射到XAML中的命令。 http://mvvmlight.codeplex.com/discussions/252898

+0

+1太棒了! KeyEventToCommand就是我正在尋找的... – 2011-09-12 00:24:53

相關問題