gpt4 book ai didi

c# - DataWindowButton CanExecute 未触发,Catel 4.0

转载 作者:太空宇宙 更新时间:2023-11-03 23:47:55 28 4
gpt4 key购买 nike

我刚刚将一个项目从 Catel 3.4 更新到 Catel 4.0,并且一直有效的自定义应用按钮现在从未启用。

AddCustomButton(new DataWindowButton("Apply", ExecuteApply, canExecuteApply));

在 Catel 3.4 中,当窗口获得焦点或任何控件更改时,会调用 canExecuteApply。在 4.0 中,它在创建窗口时被调用两次,并且再也不会被调用。

我怀疑这与更新指南的 IViewPropertySelector 部分有关,但是注册默认实现没有任何效果,我无法弄清楚 AutoDetectViewPropertiesToSubscribe 扩展方法在哪个命名空间中。

编辑:我发现我在应用程序其他地方的一些 AsynchronousCommand 实例中得到了相同的行为。 CanExecute 委托(delegate)在创建控件时触发,然后再也不会触发。

编辑 2:这些是不同解决方案的相同问题。有关此问题的解释,请参阅 Geert van Horrik 的回答。

如果该命令已在 View 模型中注册,您可以使用

ViewModelCommandManager.InvalidateCommands(true);

获取可执行状态以重新评估。对于如上所述的 DataWindowButton,我不得不在按钮的命令上手动调用 RaiseCanExecuteChanged,因为据我所知,该命令不属于 vie 模型。

var catelCommand = (applyButton.Command as ICatelCommand);
if (catelCommand != null)
{
catelCommand.RaiseCanExecuteChanged();
}

无论哪种情况,这都远非具有最佳性能特征的方法,但如果需要升级前的相同行为,您可以在以下事件订阅中进行这些调用:

System.Windows.Input.CommandManager.RequerySuggested += RequerySuggested;

希望这对面临此问题的其他人有所帮助。

最佳答案

原因是在过去(4.0 之前),Catel 订阅了 WPF 的 CommandManager 并使几乎所有 View 模型上的所有命令都无效(鼠标移动、焦点等)。为了(大量)提高性能,我们决定仅在特定 View 模型上的属性更改时自动使命令无效。

例如,如果您有一个更改属性的虚拟机,它会自动重新评估该虚拟机上的命令。您仍然可以使用此代码(在虚拟机内)手动重新评估命令:

ViewModelCommandManager.InvalidateCommands(true);

关于c# - DataWindowButton CanExecute 未触发,Catel 4.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27005301/

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