WPF + MvvM + Prism

2Fa*_*uBR 4 wpf prism unity-container mvvm

我是Wpf和Mvvm世界的新手,但我发现了几个例子,并且发现有一些不同的方式来实例化模型.我想知道最好/最正确的方法.两种方式都使用Unity

我发了什么:

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

我做了什么:

var navigatorView = m_Container.Resolve<MainView>;
m_RegionManager.Regions["NavigatorRegion"].Add(navigatorView);
Run Code Online (Sandbox Code Playgroud)

并且我更改了构造函数以接收viewmodel,因此我可以将datacontext指向它:

public MainView(NavigatorViewModel navigatorViewModel)
{
 this.DataContext = navigatorViewModel;
}  
Run Code Online (Sandbox Code Playgroud)

其他例子我发现了另一种方式:

...vm = new viewmodel 
...m = new model
v.model = vm;
Run Code Online (Sandbox Code Playgroud)

获取/设置DataContext

干杯

And*_*mes 8

我喜欢Igor的建议,但没有viewmodel知道视图.我更喜欢我的依赖项向一个方向(View - > ViewModel - > Model).

我所做的是ViewModel-First,只是DataTemplate的viewmodel.所以我这样做:

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

region.Add(mainViewModel, "MainView");
region.Activate(mainViewModel);
Run Code Online (Sandbox Code Playgroud)

添加了ViewModel - >使用WPF数据模板完成的视图映射(不过我认为这种方法不适用于Silverlight)

App.xaml中:

<Application.Resources>
     <DataTemplate DataType="{x:Type viewModels:MainViewModel}">
          <views:MainView />
     </DataTemplate>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

而已!我喜欢这种方法.我喜欢它的感觉就像魔术一样.它还具有以下优点:

  • 不必修改构造函数以适应映射
  • 不必在容器中注册IMyViewModel类型...您可以使用具体类型.我喜欢将我的注册保存到IViewRegistry或ILogger这样的应用程序服务......那些东西
  • 您可以使用范围限定为区域所在的特定视图的资源来更改映射(如果您想重用ViewModel但希望它们在应用程序的不同区域看起来不同,这很好

  • 这是我们大多数"传统"MVVM开发人员使用的方法......在引入PRISM时使用DataTemplate的问题被大大遗漏或者与MVP示例的使用混淆.+1 (3认同)