C# 如何告诉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

我正在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>();
}
这是可行的,但定位器总是返回相同的视图模型,即相同的实例,这意味着如果打开了多个“产品详细信息”窗口,它们将共享相同的视图模型


当我请求创建一个新的视图模型时,我如何告诉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());