我试图掌握 ViewModelLocator 的概念(在 MVVM Light 中,尽管问题通常适用于 ViewModelLocator 的概念,无论使用哪个 MVVM 框架),我很难弄清楚如何使用它。
据我了解,您的视图使用定位器的单例实例上的属性之一作为它们的数据上下文。定位器定义了这些不同的属性,并为每个属性返回正确的视图模型实例。
这一切都很好,但我很难理解你是如何用视图应该呈现的模型数据实际填充这些视图模型的。
例如,假设我有一个显示员工列表的视图。我可以创建一个EmployeesView 和一个EmployeesViewModel。在 ViewModelLocator 中,我可以创建一个返回此EmployeesViewModel 的属性:
public EmployeesViewModel Employees
{
get
{
return ServiceLocator.Current.GetInstance<EmployeesViewModel>();
}
}
现在,viewmodel 需要一个员工列表,所以我可以创建某种返回所有员工的数据服务,并将其注册到 ViewModelLocator 的构造函数中的 Servicelocator:
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<IDataService, AllEmployeesDataService>();
}
因此,这将起作用,如果我实例化EmployeesView,EmployeesViewModel 将被实例化并注入一个返回所有员工的数据服务。
但是,现在我想查看刚刚在EmployeesView 中单击的某个员工的详细信息。该员工大概有某种 ID,可以通过它从数据库或其他任何地方检索他/她。
我可以创建一个 EmployeeDetailsView 和一个 EmployeeDetailsViewModel,并向 ViewModelLocator 添加一个属性:
public EmployeeDetailsViewModel EmployeeDetails
{
return ServiceLocator.Current.GetInstance<EmployeeDetailsViewModel>();
}
也许在 ViewModelLocator 的构造函数中注册某种数据服务:
SimpleIoc.Default.Register<IDataService, EmployeeDetailsDataService>();
但是我如何告诉数据服务或视图模型他们应该为哪个员工提供详细信息?我在哪里传递员工 ID?
我看这一切都错了吗?有人知道任何好的例子吗?我能找到的所有示例都只返回每个视图模型的相同单个实例。