WPF. RelayCommand - CanExecute false, в то время как Execute обрабатывает - PullRequest
0 голосов
/ 31 января 2012

Я хочу отключить кнопку во время обработки ее команды.

    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 ]

1 голос
/ 02 февраля 2012

Решение для решения проблемы:

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

The

CommandManager.InvalidateRequerySuggested();

должен быть добавлен в метод CanExecute, а не в Execute. _isSearchInProgress обновляется внутри DoSearch (), который запускается в отдельном потоке (в моем случае backgroundWorker.RunWorkerAsync).

0 голосов
/ 31 января 2012

Если вы не работаете в фоновом потоке или Задаче, графический интерфейс не будет запрашивать обновления из части CanExecute. Если вы делаете вещи в фоновом режиме, просто убедитесь, что _isSearchInProgress создан не внутри какой-либо функции, а является частью класса.

...