0

我想禁用一个按钮,同时它的命令正在处理。

    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);

提前感谢您的帮助。

4

2 回答 2

1

解决问题的办法:

Search = new RelayCommand<string>(
            backgroundWorker.RunWorkerAsync,
            param =>
                {
                    CommandManager.InvalidateRequerySuggested();
                    return !_isSearchInProgress;
                });

CommandManager.InvalidateRequerySuggested();

应该添加到 CanExecute 方法中,而不是在 Execute 中。_isSearchInProgress 在 DoSearch() 内部更新,该线程在单独的线程中运行(在我的情况下为 backgroundWorker.RunWorkerAsync)。

于 2012-02-02T12:46:39.203 回答
0

除非您在后台线程或任务中运行,否则 GUI 不会要求来自 CanExecute 部分的更新。如果你在后台做事,只要确保 _isSearchInProgress 不是在 any 函数中创建的,而是类的一部分。

于 2012-01-31T17:51:55.723 回答