在查看Josh Smith关于CommandGroup
的文章时,我注意到互联网上有很多关于如何实施ICommand.CanExecuteChanged
的评论。
在StackOverflow上发布了一个类似的问题here,但是
供参考:
CommandGroup
的原始article使用简单的.NET事件RelayCommand
使用CommandManager
implementation CanExecuteChanged
RoutedCommand
使用CommandManager
implementation CanExecuteChanged
我对WPF比较陌生,我想知道如何在Josh Smith的CanExecuteChanged
中实现CommandGroup
事件以避免任何意外行为或内存泄漏?
Josh Smith: Aggregating WPF Commands with CommandGroup
Josh Smith: WPF apps with the MVVM design pattern
StackOverflow: Is Josh Smith's implementation of the RelayCommand flawed?
答案 0 :(得分:0)
让我们假设您将命令绑定到按钮。当即将呈现该按钮时,它将调用CanExecute()并根据结果将呈现为Enabled或Disabled。 当"它决定"时,WPF会自动调用CanExecute(),但是你永远不应该继续这种行为。
因此,当您实现ICommand时,声明一个类似UpdateCommand()的方法,当您决定时,它将引发有问题的事件。 例如,如果点击一个按钮开始一个缓慢的操作,应该在前一个按钮完成后再次触发,你应该将事件提高两次 - 一次是在开始操作之前,一次是在完成之后。
没有"实现ICommand.CanExecuteChanged"的最佳方法。可能这是不通过框架发布ICommand的默认实现的部分原因。 大多数MVVM框架提供默认实现:RelayCommand,ActionCommand,ParameterCommand,AsyncCommand等。 他们只是让事情变得更容易 - 通过代表,你准备好了。 Josh Smith的文章解决了另一个问题,即在XAML中链接多个路由命令的简洁方法。
一般来说: