我在WPF项目中使用MvvmLight,并已建立了我的视图模型定位器,如图他们的榜样......
public class ViewModelLocator {
public ViewModelLocator() {
SimpleIoc.Default.Register<MainWindowViewModel>();
SimpleIoc.Default.Register<ProductDetailsWindowViewModel>();
}
public MainWindowViewModel MainWindowViewModel =>
SimpleIoc.Default.GetInstance<MainWindowViewModel>();
public ProductDetailsWindowViewModel ProductDetailsWindowViewModel =>
SimpleIoc.Default.GetInstance<ProductDetailsWindowViewModel>();
}
我在我的XAML的开始标记下面一行...
DataContext="{Binding Source={StaticResource Locator},
Path=ProductDetailsWindowViewModel}"
这工作,但定位器总是返回相同的视图模型,即同一个实例,也就是说,如果我有一个以上的产品详细信息窗口打开时,他们都将共享相同的视图模型。
我如何告诉MvvmLight当我要求一个创建一个新的视图模型?
我们一直使用Ninject,这似乎是你想用默认的内容: -
首先,引用添加到NuGet包的Ninject
然后,ViewModelLocator
类添加到您的项目,并使用如下代码...
public class ViewModelLocator {
public IKernel Kernel { get; set; }
public ViewModelLocator() {
Kernel = new StandardKernel();
}
public MainWindowViewModel MainWindowViewModel =>
Kernel.Get<MainWindowViewModel>();
public ProductDetailsWindowViewModel ProductDetailsWindowViewModel =>
Kernel.Get<ProductDetailsWindowViewModel>();
}
添加静态资源在App.xaml中的定位如下...
<Application.Resources>
<viewModels:ViewModelLocator x:Key="Locator" />
</Application.Resources>
确保您的视图模型从ViewModelBase
继承...
public class ProductDetailsWindowViewModel : ViewModelBase
// ...
那么你应该DataContext
工作,只要你想。每个窗口都会有自己的类的实例。
有一件事你需要确保在这里是后自己清理,否则你最终预览视图模型的负荷游逛。在你的窗口的卸载事件中,DataContext
设置为空...
private void Window_Closing(object sender, CancelEventArgs e) {
DataContext = null;
}
我如何告诉MvvmLight当我要求一个创建一个新的视图模型?
使用接受一个qazxsw POI的POI qazxsw方法的过载和独特GetInstance
值传递给它:
string