我想禁用一个按钮,而它的命令正在处理中。
public ICommand Search { get; set; }
private void InitilizeSearchCommand()
{
Search = new RelayCommand<string>(
param => DoSearch(param),
param => !_isSearchInProgress);
}
如何修改_isSearchInProgress?我无法在“执行”委托中执行此操作,因为它从无法访问该字段的地方(RelayCommand对象)执行(如果我的理解为真):
Search = new RelayCommand<string>(
param =>
{
_isSearchInProgress = true;
DoSearch(param);
_isSearchInProgress = false;
},
param => !_isSearchInProgress);
提前感谢您的帮助。
答案 0 :(得分:1)
解决问题的解决方案:
Search = new RelayCommand<string>(
backgroundWorker.RunWorkerAsync,
param =>
{
CommandManager.InvalidateRequerySuggested();
return !_isSearchInProgress;
});
在
CommandManager.InvalidateRequerySuggested();
应该添加到CanExecute方法中,而不是在Execute中。 _isSearchInProgress在DoSearch()内部更新,在单独的线程中运行(在我的情况下为backgroundWorker.RunWorkerAsync)。
答案 1 :(得分:0)
除非您在后台线程或任务中运行,否则GUI将不会要求CanExecute部分进行更新。如果你在后台做事,只要确保_isSearchInProgress不是在任何函数中创建的,而是在类的一部分。