1

IEnumerable<MyObject> MyObjects在 ViewModel 中有一个属性。我希望第二个视图模型(引用第一个)中的某个命令在MyObjects填充有至少一个对象时可执行,但在它为空时不可执行。

我的 CanExecute 方法如下所示:

private bool CanExecute()
{
    return this.viewModel.MyObjects.Any();
}

我有一个 PropertyChanged 事件,只要基础值MyObjects发生更改,就会引发该事件。

逻辑工作正常,但是 CanExecute() 方法不断被调用 - 以至于它基本上冻结了整个应用程序。同时,MyObjects 没有改变(我也没有为它引发 PropertyChanged 事件)。有什么想法可以阻止 CanExecute 不断被重新查询吗?

4

1 回答 1

1

我假设您的命令要么继承RoutedCommand,要么实现CanExecuteChanged如下:

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

这意味着将处理程序添加到您的命令CanExecuteChanged(由 WPF 执行,以决定何时调用您的CanExecute)相当于将其添加到CommandManager.RequerySuggested,它经常被提出,据我所知,没有办法强制它被降低频率.

有两种解决问题的方法:

  1. 根本不要使用RequerySuggested,只需制作CanExecuteChanged一个标准事件并在您想要检查它时专门提出它。

  2. 确保该CanExecute方法非常快,因此它运行的频率并不重要。您可以将其写为return this.viewModel.HasAnyObjects;,其中HasAnyObjects是一个简单字段,在MyObjects更改时设置为 true 或 false。

于 2013-06-18T18:51:11.173 回答