2012-03-10 45 views
0

究竟是採用虛擬機的限制,因此它可以更好地適應一個特定的視圖?例如:MVVM中的VM角色 - 它應該處理所有事情,爲什麼?

應該有一個命令在UI(例如按鈕),應該允許添加新項目。額外的要求可能是應該選擇新項目,確保它在控件上可見(可以說是TreeView控件),並開始編輯新添加的項目(以便更改在VM中設置的預定義值)。讓我們假設控件沒有自動機制來實現這一點,所以我們需要手動完成。因此,執行流程如下所示:

  1. 在VM上調用add命令 - done是View的xaml。
  2. 集的SelectedItem到新的項目(通常是我們控制的SelectedItem屬性綁定到虛擬機的CURRENTITEM屬性,然後就分配新項目CURRENTITEM
  3. 確保新產品的控制可見 - 這必須在View的代碼來完成後面。
  4. 開始編輯 - 這必須在後面查看的代碼來完成

現在,由於到處都在網上有關於使用消息幾乎一切,一個問題的文章:

我怎麼打破,如果我。以簡單的老式方式來做辦法?我使用點擊事件而不是命令綁定添加新項目,並在方法中,我這樣做:

// in View's Click event handler 
ViewModel.AddCommand.Execute(null); 
EnsureVisibleSelectedItem(); 
BeginEdit(); 

..乾淨,明確!如果我使用消息來做,我會得到什麼:

// in ViewModel's AddCommand 
AddNewItem(); 
SetCurrentItem(); 
SendMessageToEnsureVisibleSelectedItem(); 
SendMessageToBeginEditSelectedItem(); 

...其中View已註冊接收這兩條消息。

對此非常感謝。在我看來,用戶界面可以改變,虛擬機應該能夠在不改變自身的情況下采用新的用戶界面,所以我不太瞭解當前在互聯網上傳播的MVVM政策。

回答

3

我會說「讓它變得簡單」。

什麼是真正重要在MVVM是:

  • 什麼不依賴於視圖的視圖模型應該去(你的視圖模型一定不知道以任何方式視圖 - 不僅僅是通過對象參考)
  • 其他所有的視圖及其代碼隱藏

是的,在其代碼隱藏。如果代碼是與視圖相關的代碼,而不是邏輯,那麼編寫代碼就沒有問題。例如,拖拽&放置管理應該寫在代碼隱藏中。

要回答你的問題,你不以書面形式破壞任何東西:

不相關的視圖
// in View's Click event handler 
ViewModel.AddCommand.Execute(null); 
EnsureVisibleSelectedItem(); 
BeginEdit(); 

一切都在視圖模型,一切都在查看/隱藏代碼別的。這很好。

沒有,如果我看看你的第二個例子:

// in ViewModel's AddCommand 
AddNewItem(); 
SetCurrentItem(); 
SendMessageToEnsureVisibleSelectedItem(); 
SendMessageToBeginEditSelectedItem(); 

AddNewItem是OK(不涉及該視圖),SetCurrentItem是OK(不涉及該視圖),而是SendMessageToEnsureVisibleSelectedItemSendMessageToBeginEditSelectedItem什麼? EnsureVisible通常對樹視圖很有用,但如果您的視圖不是用樹視圖構建的呢?如果控件會自動使新選定的項目可見,該怎麼辦?當然你可以忽略這個消息,但是你會在ViewModel中編寫一些無用的代碼,因爲你認爲你的視圖需要它來顯示UI。

你通常寫在這裏的視圖模型一些代碼,知道的觀應該如何工作的。 是的,你已經減少了代碼隱藏的行數,但你肯定已經打破了的模式。

你的「老時尚之路」,實際上是爲您的需求的好方法。您的ViewModel不知道該視圖,這是重要的。

+0

+1:「是的,在它的後臺代碼沒有什麼錯以書面形式,如果是涉及到視圖代碼代碼隱藏」 – Uri 2012-03-11 15:25:14

+0

感謝您的評論,我的思緒也。看起來,雖然新的「幫手」正在朝另一個方向發展。例如,如果您查看event2command,它是否使VM依賴於UI?我的意思是,在Silverlight中可能存在一個事件,它在Windows Phone API中不存在。通過這種方式,我們使虛擬機成爲一個特定的平臺。 – Goran 2012-03-12 15:51:52

+0

@Goran'EventToCommand'用於XAML(不在VM中)將事件「轉換」爲命令。然後,您的ViewModel公開一個綁定到XAML中的_any_事件的「標準」ICommand屬性(感謝「EventToCommand」)。虛擬機實際上並不知道用戶界面。但我並不真誠喜歡它。它往往使事情過度複雜化。我更喜歡普通的事件處理程序,並且在代碼隱藏中使用'this.MyViewModel.MyCommand.Execute(...)'。簡單,直接,並且不會在UI代碼(即描述UI的XAML代碼)中增加無意義的複雜性。 – ken2k 2012-03-12 16:09:52

相關問題