其他分享
首页 > 其他分享> > CodeGo.net>如何告诉MVVMLight创建一个新的视图模型?

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

作者:互联网

我在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,默认情况下,它似乎可以满足您的要求:-

首先,为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>();
}

如下所示在App.xaml中为定位器添加静态资源…

<Application.Resources>
  <viewModels:ViewModelLocator x:Key="Locator" />
</Application.Resources>

确保您的视图模型继承自ViewModelBase …

public class ProductDetailsWindowViewModel : ViewModelBase
  // ...

然后,您的DataContext应该可以根据需要工作.每个窗口将获得自己的类实例.

您需要确保此处的一件事是自己进行清理,否则最终会产生大量的鬼视图模型.在窗口的Unloading事件中,将DataContext设置为null …

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

标签:mvvm-light,wpf,c
来源: https://codeday.me/bug/20191108/2006614.html