C# 如何告诉MVVMLight创建新的视图模型?
我正在WPF项目中使用MvvmLight,并已设置了视图模型定位器,如示例所示C# 如何告诉MVVMLight创建新的视图模型?,c#,wpf,mvvm-light,C#,Wpf,Mvvm Light,我正在WPF项目中使用MvvmLight,并已设置了视图模型定位器,如示例所示 public class ViewModelLocator { public ViewModelLocator() { SimpleIoc.Default.Register<MainWindowViewModel>(); SimpleIoc.Default.Register<ProductDetailsWindowViewModel>(); } public Ma
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>();
}
这是可行的,但定位器总是返回相同的视图模型,即相同的实例,这意味着如果打开了多个“产品详细信息”窗口,它们将共享相同的视图模型
当我请求创建一个新的视图模型时,我如何告诉MvvmLight创建一个新的视图模型?我们总是使用Ninject,它在默认情况下似乎可以执行您想要的操作:- 首先,添加对的Nuget包的引用 然后向项目中添加一个
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>();
}
然后,您的DataContext
应该可以正常工作。每个窗口都将获得自己的类实例
这里需要确保的一件事是自己清理干净,否则就会有大量的鬼视图模型挂在周围。在窗口的卸载事件中,将DataContext
设置为null
private void Window_Closing(object sender, CancelEventArgs e) {
DataContext = null;
}
当我请求一个视图模型时,如何告诉MvvmLight创建一个新的视图模型
使用GetInstance
方法的重载来访问string
并向其传递唯一的string
值:
public MainViewModel Main =>
ServiceLocator.Current.GetInstance<MainViewModel>(System.Guid.NewGuid().ToString());
public MainViewModel Main=>
ServiceLocator.Current.GetInstance(System.Guid.NewGuid().ToString());
谢谢。我想我现在就开始使用Ninject,因为这似乎是我前进的方向。这也很有效。不过我打算开始使用Ninject。谢谢。@Joe:那很好,但是NInject和你原来的问题有什么关系?NInject会自动完成所有这些。此外,它使单元测试更简单。所以,如果这解决了我的问题,并且这是一个我想要开始使用的包,那么我会去做。你的答案也很有效。但是@mm8的答案仍然是这个问题的答案,所以我认为应该接受它。
public class ProductDetailsWindowViewModel : ViewModelBase
// ...
private void Window_Closing(object sender, CancelEventArgs e) {
DataContext = null;
}
public MainViewModel Main =>
ServiceLocator.Current.GetInstance<MainViewModel>(System.Guid.NewGuid().ToString());