WPF。 RelayCommand - 执行正在处理时,CanExecute为false

时间:2012-01-31 16:26:31

标签: wpf relaycommand

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

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

提前感谢您的帮助。

2 个答案:

答案 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不是在任何函数中创建的,而是在类的一部分。