20

我开始使用 Metro 风格的应用程序(我知道我们不应该将其称为 Metro,但我永远不记得它应该被称为什么......),并且我正在实现一个DelegateCommand用于 MVVM 的类。在 WPF 中,ICommand.CanExecuteChanged事件通常是这样实现的:

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

但是CommandManager该类在 WinRT 中不存在……还有别的东西吗?还是我们应该自己明确触发这个事件?

4

2 回答 2

14

在 WinRT 中,您必须手动更新/提升 CanExecuteChanged。没有 CommandManager 可以全局执行此操作。你可以把这看作是一种痛苦,或者因为 CanExecute 没有被经常调用,所以性能得到了严重的提升。这确实意味着您必须考虑在您不必考虑级联属性更改之前。但事实就是这样。手动的。

public void RaiseCanExecuteChanged()
{
    if (CanExecuteChanged != null)
        CanExecuteChanged(this, EventArgs.Empty);
}
于 2012-09-25T15:51:53.643 回答
1

使用 WPF,您必须ICommand.CanExecuteChanged按照您的描述实现。但是,对于 Silverlight,情况并非如此。请参阅此相关问题:

WPF CommandParameter 绑定未更新

我的猜测是,在 WinRT 中,就像在 Silverlight 中一样,CommandManager没有必要。

请参阅此处的相关讨论:

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/477cdd19-ee88-4746-97fe-59b8dbd44e0a/

于 2012-08-20T11:25:33.857 回答