我正在自己制作一些自定义ICommand的实现,我看到很多实现都像这样:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
protected void RaiseCanExecuteChanged()
{
CommandManager.InvalidateRequerySuggested();
}
据我所见,这段代码优化得很差,因为调用RaiseCanExecuteChanged()
将触发UI中的所有命令检查它们的ICommand.CanExecute
状态,而通常我们只希望其中一个验证它。
我记得曾经阅读过关于一些WPF ICommands的主要代码,比如RoutedCommand
,对于它们来说是有意义的,因为它们希望在某个控件失去焦点或其他类似情况时自动重新验证所有ICommand,但我仍然不明白为什么人们会为自己的ICommand
实现重复这种模式。
我所考虑的代码是简单的事件调用,例如:
public event EventHandler CanExecuteChanged;
protected void RaiseCanExecuteChanged()
{
CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}
我测试过这个方法是有效的,那么为什么网上的所有示例都没有实现这么简单的东西?难道我错过了什么吗?
我读过在普通事件中使用强引用可能导致内存泄漏问题的文章,在这种情况下,CommandManager
只使用WeakReferences
,这种方式可以确保视图被垃圾回收,但是,是否有一些解决方案不会在内存占用和性能之间做出妥协呢?