c# - 为什么人们在 ICommand 上使用 CommandManager.InvalidateRequerySuggested()?

标签 c# wpf

我正在制作我自己的一些自定义 ICommand 实现,我看到很多实现都是这样的:

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

protected void RaiseCanExecuteChanged()
{        
    CommandManager.InvalidateRequerySuggested();
}

据我所知,这是优化不佳的代码,因为调用 RaiseCanExecuteChanged() 将触发 UI 中的所有命令以检查它们的 ICommand.CanExecute 状态,通常情况下我们只希望其中之一验证它。

我想我读过一次这是一些 WPF ICommand 的主要代码,比如 RoutedCommand,对他们来说这是有道理的,因为他们想在某些控件失去焦点和类似这样的事情时自动重新验证所有 ICommand ,但我仍然不明白为什么人们会为他们自己的 ICommand 实现重复这种模式。

我想到的代码是一个简单的事件调用,例如:

public event EventHandler CanExecuteChanged;

protected void RaiseCanExecuteChanged()
{        
    CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}

我测试过并且有效,所以为什么网络上的所有示例都没有实现这么简单的东西?我错过了什么吗?

我读过有关在常规事件中使用强引用的内存泄漏问题,其中 CommandManager 仅使用 WeakReferences,这在 View 被垃圾收集的情况下很好,但是尽管如此,是否有任何解决方案不会因内存占用而影响性能?

最佳答案

Why all the examples on the web don't implement something as simple as this? Am I missing something?

我猜这主要是由于懒惰......你提出的确实是一个更好(更有效)的实现。但是,它还不完整:您仍然需要订阅 CommandManager.RequerySuggested 以在命令上引发 CanExecuteChanged

关于c# - 为什么人们在 ICommand 上使用 CommandManager.InvalidateRequerySuggested()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40586345/

相关文章:

WPF 数据绑定(bind)手动更新

c# - 网站速度测试。 gzip 有问题吗?

C# 转换性能影响

c# - 获取 azure 容器中的最后一个blobitem

.net - WPF XAML - 带有 ItemSource 和子菜单项的 MenuItem

c# - ObservesProperty 方法不在 Prism 6 上观察模型的属性

c# - 使用自定义数据库而不是 ASPNETDB 的 ASP.NET MVC 身份验证?

c# - 双泛型函数的语法糖

c# - 移除 Storyboard,使其动画回到原来的状态

wpf - [WPF]如何设置数据模板中网格的宽度和高度