2010-05-05 81 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