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