gpt4 book ai didi

wpf - CanExecuteCommand 对性能有影响吗?

转载 作者:行者123 更新时间:2023-12-04 13:34:25 34 4
gpt4 key购买 nike

使用 ICommand 对象的 CanExecuteCommand 对性能有何影响。该方法是否一遍又一遍地执行?

我需要遍历大约 200 个对象的集合,根据这些对象决定是否应该启用绑定(bind)到命令的按钮? CanExecuteCommand 是否会重复执行,这会使我的应用程序变慢

最佳答案

ICommand界面如下:

public interface ICommand
{
// two methods
bool CanExecute(object parameter);
void Execute(object parameter);

// one event
event EventHandler CanExecuteChanged;
}
CanExecuteChanged任何时候都应该引发事件来表明 CanExecute方法应由 WPF 检查/调用。谁执行 ICommand应该引发事件,任何需要在 GUI(WPF 系统)上刷新按钮启用状态的人都应该注册并处理该事件,它会调用 CanExecute .

在乔什·史密斯的 RelayCommand类,他使用 WPF 的内置 CommandManager提高类 CanExecuteChanged :
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}

本质上,WPF 的 CommandManager是一个单例,它监听各种路由事件:KeyUpEvent、MouseUpEvent 等……然后通过提高它的 RequerySuggested 来告诉每个人“嘿,发生了一些有趣的事情”事件。因此,如果您使用 RelayCommand , 你的 CanExecute每次都会被调用 CommandManager认为 GUI 上发生了一些有趣的事情(即使它与您的收藏无关)。如果您有 50 条命令,则每次键入时,它都会重新检查所有 50 条命令。所以是的,这可能是一个性能问题。但是,如果您的 CanExecute 中的逻辑方法很简单,应该没问题。要点:不要在 CanExecute 中进行数据库或网络 API 调用方法。

捎带的替代方案 CommandManager.RequerySuggested提高 ICommand.CanExecuteChanged事件是推出自己的 RelayCommand 版本你自己过牌和加注 CanExecuteChanged手动,或查看 Prism 框架的 DelegateCommand类,他们不绑定(bind)到 CommandManager你必须手动提高 CanExecuteChanged事件,你可以通过为 PropertyChanged 创建一个监听器来完成。然后提高 CanExecuteChanged在命令上。

我同意上面的@Will。 RelayCommand可能会在 80% 以上的时间内正常工作。如果您确实开始发现性能问题,那么您可以创建自己的 RelayCommand 版本或使用 Prism DelegateCommand并提高 CanExecuteChanged手动。

关于wpf - CanExecuteCommand 对性能有影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7335668/

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