我是Wpf和Mvvm世界的新手,但我找到了几个例子,并发现有一些不同的方式来实例化模型 . 我想知道最好/最正确的方法 . 两种方式都使用Unity
我发了什么:
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);
并且我更改了构造函数以接收viewmodel,因此我可以将datacontext指向它:
public MainView(NavigatorViewModel navigatorViewModel)
{
this.DataContext = navigatorViewModel;
}
其他例子我发现了另一种方式:
...vm = new viewmodel
...m = new model
v.model = vm;
获取/设置DataContext
干杯
2 回答
我喜欢Igor的建议,但没有viewmodel知道视图 . 我更喜欢我的依赖项去一个方向(View - > ViewModel - > Model) .
我所做的是ViewModel-First,只是DataTemplate的viewmodel . 所以我这样做:
添加了ViewModel - >使用WPF数据模板完成的视图映射(不过我认为这种方法不适用于Silverlight)
App.xaml中:
而已!我喜欢这种方法 . 我喜欢它的感觉就像魔术一样 . 它还具有以下优点:
不必修改构造函数以适应映射
不必在容器中注册IMyViewModel类型...您可以使用具体类型 . 我喜欢将我的注册保存到IViewRegistry或ILogger这样的应用程序服务......那些东西
您可以使用作用域的资源更改映射到某个区域所在的特定视图(如果您想重用ViewModel但希望它们在应用程序的不同区域看起来不同,这很好
你在那里得到的是有道理的,在这两种情况下都是View-first方法来创建一个viewmodel . 即视图创建ViewModel . 在原始示例中,viewmodel是在视图外部创建的(有时也称为marriage pattern),但就我而言,这是一回事 - 创建视图会创建ViewModel .
如果这符合您的需求坚持下去 . 您可能会考虑的另一种方法是ViewModel,其中viewmodel首先依赖于视图,如下所示:
然后您可以像这样注入此视图: