gpt4 book ai didi

c# - 每当有 UI 交互时,如何防止 CommandManager 调用 CanExecute?

转载 作者:太空宇宙 更新时间:2023-11-03 13:12:26 25 4
gpt4 key购买 nike

我们的 UI 目前有很多控件绑定(bind)到具有一些复杂 CanExecutes 的命令。我们面临的问题是,每当 CommandManager 确定 UI 需要重新评估时,所有命令都会运行它们的 CanExecute,这反过来会对性能造成相当大的影响具体场景。

阅读这篇文章:How does CommandManager.RequerySuggested work?

CommandManager 似乎会在简单的按键按下、鼠标移动事件等情况下重新评估。有没有办法防止这种情况发生,而是让命令管理器重新评估什么时候手动调用?

最佳答案

一个解决方案可能是实现一个更简单的 RelayCommand 类版本,它只存储事件处理程序本身并公开一个公共(public)方法以在适当的时候触发它们:

public class RelayCommand : ICommand
{
public event EventHandler CanExecuteChanged;

// Further ICommand implementation omitted...

public void Invalidate()
{
var handler = this.CanExecuteChanged;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}

然后您在 viewModel 中调用以下命令来重新评估命令:

fooCommand.Invalidate();

当然,这会给您带来相反的问题,您现在必须手动重新评估所有命令...

编辑

为了详细说明注释,大多数 RelayCommand 都像这样实现 CanExecuteChanged 事件:

public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}

当 UI 订阅命令的 CanExecuteChanged 事件时,它实际上是间接订阅了 CommandManager.RequerySuggested 事件,这就是为什么您的 CanExecute每次 CommandManager 建议重新查询时都会调用方法。

我建议的更简单的 RelayCommand 通过不订阅 CommandManager.RequerySuggested 事件来避免这个问题。

关于c# - 每当有 UI 交互时,如何防止 CommandManager 调用 CanExecute?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27911937/

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