我在ViewModel中有一个属性IEnumerable<MyObject> MyObjects。我希望第二个视图模型(引用第一个)中的某个命令在MyObjects中填充了至少一个对象时是可执行的,但当它为空时就不是可执行的了。
我的CanExecute方法看起来像这样:
private bool CanExecute()
{
return this.viewModel.MyObjects.Any();
}我有一个PropertyChanged事件,每当MyObjects的基础值发生更改时都会引发该事件。
逻辑工作正常,但是CanExecute()方法经常被调用--调用次数如此之多,以至于基本上冻结了整个应用程序。同时,MyObjects没有改变(我也没有为它引发PropertyChanged事件)。你知道怎样才能避免不断地重新查询CanExecute吗?
发布于 2013-06-19 02:51:11
我假设你的命令要么继承了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。https://stackoverflow.com/questions/17176092
复制相似问题