2010-05-05 92 views
4

我是Mvvm世界中的新手,但是我找到了幾個例子,並且發現有一些不同的方式來實例化模型。我想知道做到最好/正確的方式。這兩種方式都使用UnityWPF + MvvM + Prism

什麼我foud:

var navigatorView = new MainView(); 
navigatorView.DataContext = m_Container.Resolve<INavigatorViewModel>(); 
m_RegionManager.Regions["NavigatorRegion"].Add(navigatorView); 

我所做的:

var navigatorView = m_Container.Resolve<MainView>; 
m_RegionManager.Regions["NavigatorRegion"].Add(navigatorView); 

,我改變了構造函數接收視圖模型,所以我可以在DataContext指向它:

public MainView(NavigatorViewModel navigatorViewModel) 
{ 
this.DataContext = navigatorViewModel; 
} 

其他的例子,我發現另一種方式,如:

...vm = new viewmodel 
...m = new model 
v.model = vm; 

get/set方法的DataContext

歡呼

回答

0

你有什麼有有意義,在這兩種情況下是一個視圖優先的方法創建一個視圖模型。即該視圖創建ViewModel。在原始示例中,視圖模型是在視圖之外創建的(有時也稱爲marriage pattern),但就我而言,這是同樣的事情 - 創建視圖會創建ViewModel。

如果這適合您的需求堅持下去。你可能會考慮另一種方法是視圖模型首次在視圖模型需要依賴於視圖像這樣:

//In the bare-bones(i.e. no WPF dependencies) common interface assembly 

interfac IView { 
    void ApplyViewModel(object viewmodel); 
}  

interface IMainView : IView { 
    //this interface can actually be empty. 
    //It's only used to map to implementation. 
} 

//In the ViewModel assembly 

class MainViewModel { 
    public MainViewModel(IMainView view) { 
    view.ApplyViewModel(this); 
    } 
} 

public partial class MainView : UserControl, IMainView { 
    void ApplyViewModel(object viewmodel){ 
    DataContext = viewmodel; 
    } 
} 

然後你可以注入這種觀點就像這樣:

IRegion region = regionManager.Regions["MainRegion"]; 

//This might look strange as we are resolving the class to itself, not an interface to the class 
//This is OK, we want to take advantage of the DI container 
//to resolve the viewmodel's dependencies for us, 
//not just to resolve an interface to the class. 
MainViewModel mainViewModel = container.Resolve<MainViewModel>(); 

region.Add(mainViewModel.View, "MainView"); 
region.Activate(ordersView.View); 
8

我喜歡伊戈爾的建議,但沒有視圖模型具有該視圖的知識。我更喜歡我的依賴去一個方向(查看 - > ViewModel - >模型)。

我所做的是ViewModel-第一個,只是DataTemplate的viewmodel。所以我這樣做:

MainViewModel mainViewModel = container.Resolve<MainViewModel>(); 

region.Add(mainViewModel, "MainView"); 
region.Activate(mainViewModel); 

通過添加視圖模型的 - 用WPF DataTemplate中完成>查看地圖(我不認爲這種做法可能與Silverlight的,雖然)

的App.xaml:

<Application.Resources> 
    <DataTemplate DataType="{x:Type viewModels:MainViewModel}"> 
      <views:MainView /> 
    </DataTemplate> 
</Application.Resources> 

就是這樣!我喜歡這種方法。我喜歡這種感覺像魔術般的方式。它還具有以下優點:

  • 不必修改構造以適應映射
  • 不必用容器IMyViewModel註冊類型...你可以用實際的工作類型。我喜歡將註冊保存到IViewRegistry或ILogger等應用程序服務中。這些類型的東西
  • 可以更改映射利用的資源範圍限定於特定的觀點,即一個區域中(這是,如果你想重用你的ViewModels不錯,但希望他們看在應用
的不同區域的不同
+3

這是我們大多數「傳統」MVVM開發人員使用的方法......在引入PRISM時使用DataTemplate的問題非常容易被忽略,或者使用MVP示例混淆+1。 – 2010-11-03 06:17:20