如何分辨MVVMLight创建一个新的视图模型?

问题描述 投票:3回答:2

我在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当我要求一个创建一个新的视图模型?

c# wpf mvvm-light
2个回答
1
投票

我们一直使用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;
}

2
投票

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

使用接受一个qazxsw POI的POI qazxsw方法的过载和独特GetInstance值传递给它:

string
© www.soinside.com 2019 - 2024. All rights reserved.