作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 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; }
}
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
在命令上。
RelayCommand
可能会在 80% 以上的时间内正常工作。如果您确实开始发现性能问题,那么您可以创建自己的 RelayCommand 版本或使用 Prism
DelegateCommand
并提高
CanExecuteChanged
手动。
关于wpf - CanExecuteCommand 对性能有影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7335668/
使用 ICommand 对象的 CanExecuteCommand 对性能有何影响。该方法是否一遍又一遍地执行? 我需要遍历大约 200 个对象的集合,根据这些对象决定是否应该启用绑定(bind)到命
我是一名优秀的程序员,十分优秀!