我正在开发一个使用MVVM Light Toolkit的MVVM设计模式的WPF应用程序。目前我有这样的场景。
我将Items Control绑定到Organization集合。
此处Employee本身是一个用户控件,可在Existing和New Employee数据中重复使用。
用户可以在每个控件的Lost Focus事件中更新现有员工的详细信息(即List)。在添加新员工时,我使用用户控件 Lost Focus 事件处理了这种情况。因此,在使用MVVM Light Toolkit EventToCommand 的用户控制丢失焦点事件时,我将EventArgs传递给View Model,然后从 EventArgs 中查找原始源(或遍历可视树) )通过使用IsKeyBoardFocusWithin属性检查焦点是否在同一用户控件内来识别是否要插入。
这是MVVM模式上的正确实现吗?
同样通过以上方法,我必须:
遍历可视树或获取原始来源 来自EventArgs我必须引用System.Windows.Controls。
在单元测试方面,它会更难 模拟EventArgs。
有没有更好的MVVM方法来处理这种情况...
答案 0 :(得分:3)
正如您所提到的,在ViewModel
中应该避免遍历Visual Tree因此,此方法的替代方法可能是使用Behavior - Tutorial
AddNewEmployeeBehavior
RelayCommand<Employee> AddNewEmployeeCommand;
。RelayCommand<Employee>
AddNewEmployeeBehavior
类型的DP
AddNewEmployeeCommand
AddNewEmployeeBehavior
执行您在VM中执行的操作,以检查是否需要将新项目添加到List<Employee>
Employee
对象中。List<Employee>
现在使用这种方法,您在视图中没有任何EventToCommand
内容。您只需要一个将Command作为DP的行为,并根据您所拥有的仅查看条件让它在需要时调用Command。
至于单元测试,现在非常简单,只需要一个RelayCommand,你可以在单元测试中调用它。
这将作为MVVM解决方案保留,因为您的VM中不再有任何与View相关的逻辑,而Behavior会为View处理它。
VM - &gt;视图模型
DP - &gt; Dependency Property