gpt4 book ai didi

wpf - MVVM 模式中的失去焦点事件策略

转载 作者:行者123 更新时间:2023-12-04 08:44:59 24 4
gpt4 key购买 nike

我正在开发一个带有 MVVM 设计模式的 WPF 应用程序,它使用了 MVVM Light Toolkit。目前我有这样的场景。

enter image description here

我将项目控件绑定(bind)到组织集合。

  • 由组织名称和列表组成的组织。
  • 由项目名称、列表和新员工组成的项目
  • 由 Emp 姓名、联系电话和电子邮件
  • 组成的员工

    enter image description here

    这里 Employee 本身是一个用户控件,在 Existing 和 New Employee 数据中被重用。

    用户可以在每个控件的失去焦点事件上更新现有员工的详细信息(即列表)。在添加新员工时,我使用用户控件 处理了这种情况失去焦点 事件。因此,使用 MVVM Light Toolkit 进行用户控制失去焦点事件EventToCommand ,我将 EventArgs 传递给 View Model,然后从 中找到原始源事件参数 (或遍历可视化树)通过使用 IsKeyBoardFocusWithin 属性检查焦点是否在同一用户控件内来确定是否要插入。

    这是 MVVM 模式的正确实现吗?

    同样通过上述方法,我必须:
  • 遍历可视化树或获取原始源
    从 EventArgs 我必须引用 System.Windows.Controls。
  • 当涉及到单元测试时,会更难
    模拟 EventArgs。

  • 那么有没有更好的 MVVM 方法来处理这种情况......

    最佳答案

    正如您提到的,在 ViewModel 中应该避免遍历可视树

    因此,这种方法的替代方法是使用 Behavior - Tutorial

  • 因此,假设您创建了一个名为 AddNewEmployeeBehavior 的行为。
  • 接下来添加 RelayCommand<Employee> AddNewEmployeeCommand;到你的虚拟机。
  • 创建类型为 RelayCommand<Employee> 的 DP在 AddNewEmployeeBehavior
  • 在 View 中将 Behavior 的 DP 绑定(bind)到 AddNewEmployeeCommand
  • 现在在 AddNewEmployeeBehavior执行您在 VM 中所做的操作,检查是否需要将新项目添加到 List<Employee>
  • 当需要将新项目添加到保存在 VM/模型中的列表中时,调用 DP 命令在行为中传递新员工详细信息,该详细信息包含在 Employee 中。目的。
  • 在 VM 中,相应地创建您的 RelayCommand 以将它的调用参数附加到 List<Employee>

  • 现在使用这种方法,您没有任何 EventToCommand View 中的东西。您只需有一个将命令作为 DP 的行为,并在需要时根据您拥有的仅查看条件调用命令。

    至于单元测试,现在非常简单,因为您所拥有的只是一个 RelayCommand,您可以在单元测试中根据需要调用它。

    这将作为 MVVM 解决方案保留,因为您的 VM 中不再有任何与 View 相关的逻辑,而 Behavior 会为 View 处理它。

    虚拟机 -> View 模型

    DP -> Dependency Property

    关于wpf - MVVM 模式中的失去焦点事件策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16417123/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com