MVVM模式中丢失的焦点事件策略

时间:2013-05-07 10:47:09

标签: wpf mvvm mvvm-light

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

enter image description here

我将Items Control绑定到Organization集合。

  1. 由组织名称和列表组成的组织。
  2. 由项目名称,列表和新员工组成的项目
  3. 由Emp Name,Contact No和Email
  4. 组成的员工

    enter image description here

    此处Employee本身是一个用户控件,可在Existing和New Employee数据中重复使用。

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

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

    同样通过以上方法,我必须:

    1. 遍历可视树或获取原始来源 来自EventArgs我必须引用System.Windows.Controls。

    2. 在单元测试方面,它会更难     模拟EventArgs。

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

1 个答案:

答案 0 :(得分:3)

正如您所提到的,在ViewModel

中应该避免遍历Visual Tree

因此,此方法的替代方法可能是使用Behavior - Tutorial

  • 因此,我们假设您创建了一个名为AddNewEmployeeBehavior
  • 的行为
  • 接下来向您的虚拟机添加RelayCommand<Employee> AddNewEmployeeCommand;
  • RelayCommand<Employee>
  • 中创建AddNewEmployeeBehavior类型的DP
  • 在视图中将行为的DP绑定到AddNewEmployeeCommand
  • 现在在AddNewEmployeeBehavior执行您在VM中执行的操作,以检查是否需要将新项目添加到List<Employee>
  • 当需要将新项目添加到VM / Model中保留的列表中时,在行为中调用DP命令,将新的员工详细信息包含在Employee对象中。
  • 在虚拟机中,相应地创建您的RelayCommand,将其调用后的参数附加到List<Employee>

现在使用这种方法,您在视图中没有任何EventToCommand内容。您只需要一个将Command作为DP的行为,并根据您所拥有的仅查看条件让它在需要时调用Command。

至于单元测试,现在非常简单,只需要一个RelayCommand,你可以在单元测试中调用它。

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

VM - &gt;视图模型

DP - &gt; Dependency Property