如何告诉 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?
使用接受 string
的 GetInstance
方法的重载,并向其传递一个唯一的 string
值:
public MainViewModel Main =>
ServiceLocator.Current.GetInstance<MainViewModel>(System.Guid.NewGuid().ToString());
我在 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?
使用接受 string
的 GetInstance
方法的重载,并向其传递一个唯一的 string
值:
public MainViewModel Main =>
ServiceLocator.Current.GetInstance<MainViewModel>(System.Guid.NewGuid().ToString());