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不断被重新查询?
我假设你的命令要么继承 RoutedCommand,要么像这样实现CanExecuteChanged
:
public event EventHandler CanExecuteChanged {
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
这意味着将处理程序添加到命令的CanExecuteChanged
(WPF 会这样做,以决定何时调用您的CanExecute
(等效于将其添加到 CommandManager.RequerySuggested
中,这经常引发,据我所知,没有办法强制它被提高的频率降低。
有两种方法可以解决此问题:
根本不要使用
RequerySuggested
,只需将CanExecuteChanged
设置为标准事件,并在您想要检查时专门提出它。确保
CanExecute
方法非常快,因此运行频率无关紧要。您可以将其编写为return this.viewModel.HasAnyObjects;
,其中HasAnyObjects
是一个简单的字段,当MyObjects
更改时设置为 true 或 false。