2009-09-16 21 views
0

我一直在尋找關於如何最好地接近我正在處理的新應用程序的想法,這將是PRISM 2/WPF應用程序。特別是在PRISM附帶的View Injection示例應用程序中,我注意到所有視圖都實現了一個允許演示者(或ViewModel)與View交互的界面。MVVM - 視圖是否應該引用Presenter/ViewModel?

在過去,我已經做了這一輪以相反的方式,我注入了主持人到視圖,以便視圖可以直接打電話到方法上演示有點像這樣:

public partial class SomeView : ModuleBase 
    { 

     private ISomePresenter _somePresenter; 

     public SomeView (ISomePresenter somePresenter):this() 
     { 
      // Give the view a reference to the presenter 
      _somePresenter = somePresenter; 
      // Bind the View to the presenter 
      DataContext = _somePresenter; 
     } 

    private void btnSubmit_Click(object sender, RoutedEventArgs e) 
    { 
     // The view can call actions directly on the presenter (OK I should probably use a command for this) 
     _somePresenter.SomeAction(); 
    } 
} 

的技術上面對我來說似乎是合理的,但看着樣本,我開始質疑這種方法。有沒有人有意見(沒有雙關語意)在這方面的最佳途徑?

  • 演示添加到視圖,並獲得與演示
  • 交互的視圖的視圖添加到演示,讓演示者與視圖交互
  • 完全不同的東西,我沒有想到了嗎?

回答

2

我認爲這都是品味的問題。就我個人而言,我喜歡你在你看到的樣品中看到它的方式。 IView有一個方法,即SetViewModel(...)。 IViewModel有一個名爲View的類型爲Object的屬性,它基本上返回DI實例化的IView。

我之所以喜歡這種方式,我幾乎總是需要先創建一個視圖模型,我想無人在代碼中可以做任何事情與我的iView中,除了得到參考實例(圖注射或綁定視圖來說一個ContentControl),這就是爲什麼它的類型對象。如果任何代碼需要與視圖交談,對我而言,它總是通過虛擬機......即使這樣,通常通過綁定來更新視圖。從View-> ViewModel-> UpdateBinding-> View看起來很奇怪,VM-> UpdateBinding->查看

要回答這個問題,我通常不需要參考主講人在代碼隱藏中。通常我可以使用綁定到虛擬機的視圖中的命令來處理它。 在某些情況下,您可能希望繼續引用演示者以完成示例中的操作,但是在給定正確的工具集(使SL更加難以使其不具有內置命令)的情況下,它是可以避免的。

就像我說的,它是偏愛的問題了...

-Jer

5

最常見的方法來一個視圖模型映射到MVVM視圖是使用DataTemplate

<DataTemplate DataType="{x:Type vm:SomeViewModel}"> 
    <v:SomeView /> 
</DataTemplate> 

當您在ContentControl或ItemsControl中顯示ViewModel實例時,WPF將自動爲ViewModel實例化適當的視圖,並將視圖的DataContext設置爲ViewModel實例。

這樣,您沒有任何對ViewModel中的視圖的引用,並且視圖僅通過DataContext屬性引用ViewModel。如果你確實需要訪問View的代碼隱藏中的ViewModel,你總是可以投出DataContext(但這意味着View知道ViewModel的實際類型,這引起了耦合)。

+0

我最近很想知道這個。我幾乎完全使用DataTemplates,並開始感覺DataTemplate是視圖。這意味着指定DataType參數將視圖耦合到視圖模型。我對這種類型的耦合沒有問題,但它違背了Prism4文檔中的一句話:「同樣,視圖理想上不應該依賴視圖模型的任何特定實現。」對我來說,視圖是丟棄的部分,可以在任何時候被另一個視圖取代。讓它與視圖模型相結合是可以接受的。 – Christo 2011-04-25 15:09:14