我开始使用Metro风格的应用程序(我知道我们不应该称它为Metro,但我永远不会记得它应该被称为...),而我正在实现{{1用于MVVM的类。在WPF中,DelegateCommand
事件通常是这样实现的:
ICommand.CanExecuteChanged
但WinRT中不存在 public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
类......还有别的东西吗?或者我们应该自己明确地触发这个事件?
答案 0 :(得分:13)
在WinRT中,您必须手动更新/引发CanExecuteChanged。没有CommandManager可以全局执行此操作。您可以将此视为颈部疼痛,或者由于CanExecute不会被持续调用而导致严重的性能提升。它确实意味着您必须考虑在不必要之前将级联属性更改。但事实就是如此。手册。
public void RaiseCanExecuteChanged()
{
if (CanExecuteChanged != null)
CanExecuteChanged(this, EventArgs.Empty);
}
答案 1 :(得分:1)
使用WPF,必须按照您的描述实施ICommand.CanExecuteChanged
。但是,对于Silverlight,情况并非如此。请参阅此相关问题:
WPF CommandParameter binding not updating
我的猜测是在WinRT中,就像在Silverlight中一样,CommandManager
不是必需的。
请参阅此处的相关讨论:
http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/477cdd19-ee88-4746-97fe-59b8dbd44e0a/