移至 Catel 后 CanExecute 方法未触发 4.x

CanExecute methods not firing after moving to Catel 4.x

跟进 问题及其答案(确实解决了我的问题),我有几个问题:

  1. 我在哪里检索 ViewModelManager 以传递给 RequeryAllTheThings 的构造函数?目前,我在加载的第一个视图模型中使用 ViewModelBase.ViewModelManager 属性 ,但这似乎不够优雅。我尝试使用 ServiceLocator,但它返回的对象从未管理过任何视图模型。
  2. 答案暗示有一种方法会表现得更好,但我无法在文档或 SO 上找到它。具体来说,当 DataGrid 中的控件更改状态时,我需要 CanExecute 方法来触发我的命令。正确的做法是什么?
  1. IViewModelManager 已在 ServiceLocator 中注册。使用 TypeFactory(它将自动从 ServiceLocator 解析依赖关系)来构建需要 IViewModelFactory 的类型。

  2. 正确的做法是只在必要时使命令状态无效。 CommandManager.RequerySuggested 几乎对任何路由命令(鼠标移动、键盘等)无效。虽然这在您的 Intel Core i7 super powered cpu 上可能效果很好,但世界上有些人 运行 速度较慢的机器。所以 Catel 试图找到最好的 "out-of-the-box" 体验可能,即如果视图模型上的 属性 发生变化(这通常是命令状态失效的原因)则使状态失效。

您可以创建自己的监听器来监听相关的 DG 事件,并在发生此类事件时使命令无效。