WPF 可以不断执行重新查询

本文关键字:执行 重新查询 WPF | 更新日期: 2023-09-27 18:18:51

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

我的 CanExecute 方法看起来像这样:

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

我有一个 PropertyChanged 事件,每当更改 MyObjects 的基础值时都会引发该事件。

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

WPF 可以不断执行重新查询

我假设你的命令要么继承 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。