如何告诉 MVVMLight 创建一个新的视图模型?

How to tell MVVMLight create a new view model?

我在 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}"

这有效,但定位器总是 returns 相同的视图模型,即相同的实例,这意味着如果我有多个产品详细信息 window 打开,它们将共享相同的查看模型。

当我请求时如何告诉 MvvmLight 创建一个新的视图模型?

我们总是使用 Ninject,默认情况下它似乎可以满足您的要求:-

首先,为 Ninject

添加对 Nuget 包的引用

然后将 ViewModelLocator class 添加到您的项目并使用如下代码...

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 应该会如您所愿。每个 window 都将获得自己的 class.

实例

这里你需要确保的一件事是自己清理,否则你最终会得到大量的幻影视图模型。在 window 的卸载事件中,将 DataContext 设置为 null...

private void Window_Closing(object sender, CancelEventArgs e) {
  DataContext = null;
}

How do I tell MvvmLight to create a new view model when I request one?

使用接受 stringGetInstance 方法的重载,并向其传递一个唯一的 string 值:

public MainViewModel Main =>
    ServiceLocator.Current.GetInstance<MainViewModel>(System.Guid.NewGuid().ToString());