RelayCommand CanExecute поведение не работает - PullRequest
3 голосов
/ 21 сентября 2010

У меня проблемы с получением RelayCommand для правильного включения / отключения подключенного элемента управления.

У меня есть элемент EventToCommand, прикрепленный к кнопке.Команда привязана к ViewModel.Сначала кнопка отключена (ожидаемое поведение), но я не могу получить логику CanExecute для проверки ее значения.Когда CurrentConfigFile установлено и существует, кнопка должна быть включена.Я выполнил код и проверил значение файла в отладке, чтобы убедиться, что он установлен, но элемент управления по-прежнему отключен.Я пробовал CommandManager.InvalidateRequerySuggested() и command.RaiseCanExecuteChanged(), но не включится.

Я задавался вопросом, не работают ли лямбды правильно для поведения CanExecute (даже если их используют примеры) или что поведение CanExecute должно быть привязано к другому элементу.

Вот мой код:

// The FileInfo being checked for existence before the button should be enabled
public const string CurrentConfigFilePN = "CurrentConfigFile";
public FileInfo CurrentConfigFile
{
    get
    {
        return _currentConfigFile;
    }

    set
    {
        if (_currentConfigFile == value)
        {
            return;
        }

        var oldValue = _currentConfigFile;
        _currentConfigFile = value;

        // Update bindings, no broadcast
        RaisePropertyChanged(CurrentConfigFilePN);
    }
}

public MainViewModel()
{
    // snip //

    SaveCommand = new RelayCommand(SaveConfiguration, 
        () => CurrentConfigFile != null && CurrentConfigFile.Exists);
    }

private void SaveConfiguration()
{

    // export model information to xml document
    ExportXMLConfiguration(CurrentConfigFile);

}

и разметка

<Button x:Name="SaveButton" Content="Save" Width="75" Margin="20,5">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <GalaSoft:EventToCommand x:Name="SaveETC" 
                Command="{Binding SaveCommand}" 
                MustToggleIsEnabledValue="true" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

Обновление:

Согласно предложению Исака Саво, я связал RelayCommand непосредственно к кнопке с помощью

<Button x:Name="SaveButton" Content="Save" Width="75" Margin="20,5" 
Command="{Binding SaveCommand}"/>

, и она начала отключаться и правильно включаться при установке FileInfo.Думаю, я должен помнить, чтобы не исправить то, что не сломано!

Ответы [ 2 ]

2 голосов
/ 22 сентября 2010

Почему бы вам просто не привязать команду непосредственно с помощью кнопки?

<Button Command="{Binding SaveCommand}" Content="Save" />

Возможно, используемая вами функция EventToCommand путается с уведомлением команды CanExecute.

А что касается проблемы CanExecute - вы уверены, что ваш обработчик CanExecute вызывается после того, как установлено свойство CurrentConfigFile?Я обнаружил, что хотя WPF в основном хорошо справляется с запросом CanExecute, мне все равно иногда приходится принудительно запрашивать запрос через CommandManager .

РЕДАКТИРОВАТЬ: Как указано в комментариях, OP уже попробовал подход диспетчера команд.

1 голос
/ 21 сентября 2010

В MSDN написано:

При первом вызове FileInfo вызывает команду «Обновить» и кэширует информацию о файле. При последующих вызовах вы должны позвонить в «Обновить», чтобы получить последнюю копию информации.

Однако я бы не делал такую ​​проверку в обработчике CanExecute. Это может замедлить ваш пользовательский интерфейс, потому что CanExecute вызывается много раз, и я мог предположить, что такие IO-проверки могут стать медленными, например, если файл находится в сетевой папке.

...