2013-06-18 56 views
0

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

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

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

我每当MyObjects潜在价值被更改时引发一个PropertyChanged事件。

逻辑工作正常,但CanExecute()方法不断被调用 - 太多,它基本上冻结了整个应用程序。同时,MyObjects不会改变(我也不会为它提高PropertyChanged事件)。任何想法如何阻止CanExecute不断被重新查询?

+1

然后你应该找到不必要的事件的来源。 –

+0

根据您将命令绑定到哪个控件,它会在某些事件指示它检查CanExecute时执行。我相信它与CommandManager.RequerySuggested有关。 – Alan

回答

1

我假设你的命令或者继承RoutedCommand,或者它实现CanExecuteChanged这样的:

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

这意味着增加一个处理程序,你的命令的CanExecuteChanged(其中WPF做,来决定何时打电话给你CanExecute)相当于将其添加到CommandManager.RequerySuggested,这经常引发,据我所知,没有办法迫使它不经常升起。

有解决问题2种方式:

  1. 不要使用RequerySuggested可言,只是让CanExecuteChanged标准的事件,当你想要它检查明确提出。

  2. 确保CanExecute方法速度非常快,所以它运行的频率无关紧要。您可以将其编写为return this.viewModel.HasAnyObjects;,其中HasAnyObjects是一个简单字段,在MyObjects更改时设置为true或false。

+0

谢谢。正如您所怀疑的那样,我正在实施CanExecuteChanged。现在选择#2选项,它解决了问题。 – Andrew