當前MVVM設計模式有很多變體,但據我瞭解,視圖允許依賴於視圖模型。我的一位同事不同意,但他無法提供令人滿意的解釋。View和ViewModel之間的MVVM依賴關係
E.g.我的觀點包含對他們的視圖模型的參考。這並不是所有視圖都需要的,但它有助於將某些事件傳遞給無法用ICommand完成的視圖模型。
可以擁有這種依賴性嗎?有什麼缺點?
當前MVVM設計模式有很多變體,但據我瞭解,視圖允許依賴於視圖模型。我的一位同事不同意,但他無法提供令人滿意的解釋。View和ViewModel之間的MVVM依賴關係
E.g.我的觀點包含對他們的視圖模型的參考。這並不是所有視圖都需要的,但它有助於將某些事件傳遞給無法用ICommand完成的視圖模型。
可以擁有這種依賴性嗎?有什麼缺點?
主要指標是:您可以測試嗎?
該視圖絕對需要對視圖模型的引用。它會如何獲得它需要顯示的信息?通常只需在視圖的DataContext
中使用視圖模型就足夠了,但仍然構成依賴關係。如果DataContext
中沒有虛擬機,則該視圖將毫無用處。
有時您需要查看回調給虛擬機。通常我只是做這在我後面的代碼:
public MyViewModel ViewModel
{
get { return DataContext as MyViewModel; }
}
private void _someEventHandler(object sender, EventArgs)
{
ViewModel.SomeMethod();
}
抱着從視圖模型視圖一提的是,你需要小心。如果虛擬機依賴於特定的視圖實現,則它與視圖緊密結合,因此很難進行測試。
如果虛擬機需要以某種方式與視圖進行交互,則可以將需求抽象爲一個接口並使視圖實現該接口。然後,當視圖加載時,它可以爲VM提供VM自身可以與之交互的引用。
單獨通過數據綁定耦合是非常好的,但有時候視圖需要的不僅僅是視圖模型中的命令和屬性。我有一個視圖需要響應視圖模型中的事件,並且這些事件不能是路由事件。所以這個觀點需要參考其視圖模型。
我認爲這是一個好主意,試圖將其DataContext(通常在DataContextChanged事件內部)強制轉換爲正確的接口類型。這樣,視圖仍然可以通過數據模板和其他XAML進行初始化。如果您強制接口在構造函數中傳遞,您必須在代碼中創建視圖。
正如肯特所說,通過界面進行交談的原因是,您可以將其用於測試。您可以創建一個虛擬視圖,以實現此測試的接口。 – 2009-04-24 11:58:56