2013-02-25 3 views
6

Я следующую команду:RelayCommand CanExecute

<Button x:Name="bOpenConnection" Content="Start Production" 
     Grid.Row="0" Grid.Column="0" 
     Height="30" Width="120" Margin="10" 
     HorizontalAlignment="Left" VerticalAlignment="Top" 
     Command="{Binding Path=StartProductionCommand}"/> 

StartProductionCommand = new RelayCommand(OpenConnection, CanStartProduction); 

private bool CanStartProduction() 
{ 
    return LogContent != null && !_simulationObject.Connected; 
} 

CanStartProduction проверяется только тогда, когда я изменить размер пользовательского интерфейса и не обновляется на лету. Любая идея, почему она не обновляется каждый раз, когда они меняют значения?

ответ

15

CommandManager не имеет возможности узнать, что команда зависит от LogContent и _simulationObject.Connected, поэтому он не может переоценивать CanExecute автоматически при изменении этих свойств.

Вы можете явно запросить переоценку, позвонив по номеру CommandManager.InvalidateRequerySuggested. Обратите внимание, что он будет переоценивать CanExecute за все команды; если вы хотите обновить только один, вам нужно поднять CanExecuteChanged событие по самой команде, вызвав StartProductionCommand.RaiseCanExecuteChanged.

+0

Вы можете привести пример или ссылку для публикации, как пользоваться этим, пожалуйста? Я имею в виду, где вы это называете? – batmaci

+1

@batmaci, вы просто вызываете 'CommandManager.InvalidateRequeryS предложены', когда вы хотите переопределить' CanExecute' вашей команды –

0

Вы можете вызвать RaiseCanExecuteChanged в примере PropertyChanged Eventhandler.

Состояние команд не обновляется очень часто.

Когда-то я прочел хорошую статью об этом. Я опубликую его позже.

смотри также http://joshsmithonwpf.wordpress.com/2008/06/17/allowing-commandmanager-to-query-your-icommand-objects/

смотри также Refresh WPF Command

Смежные вопросы