wpf - 使用 viewmodellocator 时将模型传递给 viewmodel

标签 wpf mvvm inversion-of-control mvvm-light viewmodellocator

我试图掌握 ViewModelLocator 的概念(在 MVVM Light 中,尽管问题通常适用于 ViewModelLocator 的概念,无论使用哪个 MVVM 框架),我很难弄清楚如何使用它。

据我了解,您的 View 使用定位器的单例实例上的属性之一作为它们的数据上下文。定位器定义了这些不同的属性,并为每个属性返回正确的 View 模型实例。

这一切都很好,但我很难理解你是如何用 View 应该呈现的模型数据实际填充这些 View 模型的。

例如,假设我有一个显示员工列表的 View 。我可以创建一个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 将被实例化并注入(inject)一个返回所有员工的数据服务。

但是,现在我想查看刚刚在EmployeesView 中单击的某个员工的详细信息。该员工大概有某种 ID,可以通过它从数据库或其他任何地方检索他/她。

我可以创建一个 EmployeeDetailsView 和一个 EmployeeDetailsViewModel,并向 ViewModelLocator 添加一个属性:
public EmployeeDetailsViewModel EmployeeDetails
{
    return ServiceLocator.Current.GetInstance<EmployeeDetailsViewModel>();
}

也许在 ViewModelLocator 的构造函数中注册某种数据服务:
SimpleIoc.Default.Register<IDataService, EmployeeDetailsDataService>();

但是我如何告诉数据服务或 View 模型他们应该为哪个员工提供详细信息?我在哪里传递员工 ID?

我看这一切都错了吗?有人知道任何好的例子吗?我能找到的所有示例都只返回每个 View 模型的相同单个实例。

最佳答案

我使用的一个简单示例是使用注入(inject)到 View 模型的构造函数中的数据服务,就像您一样。该数据服务返回我的对象​​(在您的情况下为员工)的可观察集合。我在同一 View 中创建了一个列表框和详细信息网格。因此,我将列表框绑定(bind)到可观察的集合,我可以使用 collectionviewsource 对其进行样式设置和排序。对于详细信息,我创建了一个包含我想要显示的必填字段的网格。我在 View 模型中为列表框的选定项 (SelectedEmployee) 创建了一个属性,并将它们绑定(bind)在一起。然后我将详细信息网格绑定(bind)到 SelectedEmployee。这将导致字段显示来自所选员工的值。

现在您可以将其用于所有 CRUD 操作,您可以将列表框的 slecteditemchanged 事件绑定(bind)到中继命令并根据需要添加您的业务逻辑。另一件需要注意的是,您可以将其拆分以支持异步操作。我有另一个实现,我获取列表框的选定项目更改事件并执行异步获取函数来获取选定项目。

我希望这有帮助

关于wpf - 使用 viewmodellocator 时将模型传递给 viewmodel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19982503/

相关文章:

wpf - 如何使运行的WPF应用程序窗口透明?

c# - 在运行时更改自动宽度

c# - 如何使用Prism的viewlocator将多个ViewModel连接到单个View?

c# - 如何在 WPF 中使用异步初始化对 ViewModel 进行单元测试

c# - IOC 容器实际上为我做了什么?

c# - 如何在 WPF 中更改 MouseOver 上的 MenuItem 的背景

c# - 如何删除 WPF 工具包图表区和绘图区之间的空间?

c# - 如何在 MVVM 项目中的用户控件之间切换

inversion-of-control - 使用 Spring.Net 属性注入(inject)数组

c# - Ninject Constructor 参数检查参数是否存在