究竟是採用虛擬機的限制,因此它可以更好地適應一個特定的視圖?例如:MVVM中的VM角色 - 它應該處理所有事情,爲什麼?
應該有一個命令在UI(例如按鈕),應該允許添加新項目。額外的要求可能是應該選擇新項目,確保它在控件上可見(可以說是TreeView控件),並開始編輯新添加的項目(以便更改在VM中設置的預定義值)。讓我們假設控件沒有自動機制來實現這一點,所以我們需要手動完成。因此,執行流程如下所示:
- 在VM上調用add命令 - done是View的xaml。
- 集的SelectedItem到新的項目(通常是我們控制的SelectedItem屬性綁定到虛擬機的CURRENTITEM屬性,然後就分配新項目CURRENTITEM
- 確保新產品的控制可見 - 這必須在View的代碼來完成後面。
- 開始編輯 - 這必須在後面查看的代碼來完成
現在,由於到處都在網上有關於使用消息幾乎一切,一個問題的文章:
我怎麼打破,如果我。以簡單的老式方式來做辦法?我使用點擊事件而不是命令綁定添加新項目,並在方法中,我這樣做:
// in View's Click event handler
ViewModel.AddCommand.Execute(null);
EnsureVisibleSelectedItem();
BeginEdit();
..乾淨,明確!如果我使用消息來做,我會得到什麼:
// in ViewModel's AddCommand
AddNewItem();
SetCurrentItem();
SendMessageToEnsureVisibleSelectedItem();
SendMessageToBeginEditSelectedItem();
...其中View已註冊接收這兩條消息。
對此非常感謝。在我看來,用戶界面可以改變,虛擬機應該能夠在不改變自身的情況下采用新的用戶界面,所以我不太瞭解當前在互聯網上傳播的MVVM政策。
+1:「是的,在它的後臺代碼沒有什麼錯以書面形式,如果是涉及到視圖代碼代碼隱藏」 – Uri 2012-03-11 15:25:14
感謝您的評論,我的思緒也。看起來,雖然新的「幫手」正在朝另一個方向發展。例如,如果您查看event2command,它是否使VM依賴於UI?我的意思是,在Silverlight中可能存在一個事件,它在Windows Phone API中不存在。通過這種方式,我們使虛擬機成爲一個特定的平臺。 – Goran 2012-03-12 15:51:52
@Goran'EventToCommand'用於XAML(不在VM中)將事件「轉換」爲命令。然後,您的ViewModel公開一個綁定到XAML中的_any_事件的「標準」ICommand屬性(感謝「EventToCommand」)。虛擬機實際上並不知道用戶界面。但我並不真誠喜歡它。它往往使事情過度複雜化。我更喜歡普通的事件處理程序,並且在代碼隱藏中使用'this.MyViewModel.MyCommand.Execute(...)'。簡單,直接,並且不會在UI代碼(即描述UI的XAML代碼)中增加無意義的複雜性。 – ken2k 2012-03-12 16:09:52