2013-05-02 109 views
5

我是新來的C#,WPF和MVVM模式。對不起,這篇相當長的文章,我試圖設定我所有的理解點(或不理解)。命令和MVVM原理 - 繼電器命令

在學習了WPF提供的命令機制和MVVM模式的大量文本之後,我有幾個問題想起如何使用這些東西。

我知道爲WPF提供的命令允許爲可視樹的組件中保存的命令邏輯定義多個「調用點」。當一個命令被調用時,調用通過可視化樹起泡(從命令目標或焦點元素開始),直到碰到一個持有CommandBinding的元素,該CommandBinding定義了命令邏輯的位置。

看起來不錯的是,您可以定義公共命令,而不必先指定邏輯或調用點。

我也明白,遵循MVVM模式,視圖的ViewModel應該處理邏輯,而命令的基礎WPF實現只允許視覺元素來處理它,因爲通過視覺樹調用泡沫。

然後我發現在這種情況下可以使用自定義實現,例如Josh Smith的RelayCommand,因爲您將視圖元素(例如按鈕)調用的命令綁定到基礎ViewModel中的RelayCommand對象。

但是,我沒有看到它是一個命令(通過WPF命令模式的定義),因爲我們直接指定在ViewModel中引用的實現。通過這種方法,我們可以放棄從任何地方調用命令的所有好處,而無需知道邏輯的實現位置。在這種情況下,爲什麼不直接使用Click事件處理程序(例如)?

有人可以解釋我在哪裏我錯了嗎? (感謝那些看過帖子的人!)

問候。 NR

回答

4

但是,我不知道它是如何是一個命令(通過WPF命令模式的定義)了,因爲我們直接指定在ViewModel中引用的實現。

這仍然是一個命令,實現了ICommand,但它不再利用WPF中內置的路由策略。這是一個命令,但不再是一個RoutedCommand - 所以從某種意義上說,你是對的 - 它不是遵循WPF的路由命令基礎結構的原始概念,但它仍然是一個命令。

使用這種方法,我們失去了從任何地方調用命令而不知道邏輯實現的所有好處。在這種情況下,爲什麼不直接使用Click事件處理程序(例如)?

您仍然保持將邏輯從View中分離出來的好處。視圖不需要知道如何實現,ViewModel可以在不知道View如何觸發它的情況下實現該命令。該命令仍然可以來自一個手勢,一個按鈕等 - 並且可以改變(完全在XAML中),而不用改變邏輯和代碼。切換回事件處理程序打破了這一點 - 如果使用事件處理程序,更改視圖的實現需要更新事件處理程序(後面的代碼)。

+0

很好的回答。我也正在學習WPF,我發現它很難。你能評論一下如何使用另一種方法調用的命令中包含的邏輯嗎?我想在這種情況下,你會用適當的邏輯編寫一個方法,並從命令中調用它。謝謝你的時間。 – MoonKnight 2013-05-02 15:44:23

+2

@Killercam通常,你想要調用的每個「方法」都被封裝在一個「ICommand」中 - 你可以擁有一個ICommand,它只是組成多個方法,就像擁有一個調用> 1方法的方法一樣。 – 2013-05-02 15:47:21

+0

非常感謝您的時間。 – MoonKnight 2013-05-02 16:09:32

0

經過一些關於如何在MVVM項目中使用原始WPF命令行爲的進一步研究,我發現這個鏈接:http://matthamilton.net/commandbindings-with-mvvm

據我所知,它提供了一種「附加」到視圖的方式,由視圖模型處理的CommandBindings。這樣,視圖模型將能夠實現在命令調用可視樹時發現的命令綁定。

再見。