我做了一些自定义的ICommand实现我自己的,我看到的实现会像这样的很多:为什么人们在ICommands上使用CommandManager.InvalidateRequerySuggested()?
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
protected void RaiseCanExecuteChanged()
{
CommandManager.InvalidateRequerySuggested();
}
至于我可以看到,因为调用RaiseCanExecuteChanged()
将触发所有的命令,这是优化不好的代码用户界面来检查他们的ICommand.CanExecute
状态,通常我们只是想让他们中的一个来验证它。
我想我读了一次,这是一些WPF ICommands的主代码,比如RoutedCommand
,对他们来说它是有道理的,因为他们想要一旦某个控件失去焦点和像这样的事情时自动重新验证所有ICommands,不明白为什么人们将自己的模式重复用于他们自己的ICommand
实现。
我心目中的代码是一个简单的事件调用,如:
public event EventHandler CanExecuteChanged;
protected void RaiseCanExecuteChanged()
{
CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}
我测试,一切正常,所以为什么所有的网络上的例子没有实现这么简单的东西吗?我错过了什么吗?
我已阅读有关使用视图被垃圾收集在定期活动,其中CommandManager
只使用WeakReferences
,这是很好的情况下,强引用的内存泄漏问题,但尽管如此,不存在赢得任何解决方案”在性能上超越内存占用?
http://stackoverflow.com/questions/2281566/is-josh-smiths-implementation-of-the-relaycommand-flawed – ASh