2015-02-05 2 views
0

У меня есть кнопка с простой командой связывания на мой взгляд:Кнопка всегда в состоянии инвалидов

<Window ...> 
    <Window.DataContext> 
     <vm:ShellViewModel /> 
    </Window.DataContext> 
    ... 
    <Button Command="{Binding DoSomethingCoolCommand}" Content="Execute" /> 

и ВМ:

public class ShellViewModel : ObservableObject { 

    private RelayCommand _doSomethingCoolCommand; 

    public ICommand DoSomethingCoolCommand { 
     get { 
      return _doSomethingCoolCommand ?? 
       (_doSomethingCoolCommand = new RelayCommand(DoSomethingCool)); 
     } 
    } 

    private void DoSomethingCool() { ... } 

Однако кнопка отключена в приложении/view startup, и я не могу включить его. Я попытался передать оценку выполнения команды на RelayCommand, а также установить IsEnabled на представление. Я что-то упускаю?


Редактировать

RelayCommand и ObservableObject взяты из MVVM проекта фундамента, как указано в тегах. Ссылка: https://mvvmfoundation.codeplex.com

+0

Какую версии RelayCommand вы используете здесь? Это твой собственный пользовательский класс? –

+0

@RohitVats Нет, это из проекта фонда MVVM. См. Https://mvvmfoundation.codeplex.com/SourceControl/latest#MvvmFoundation/MvvmFoundation.Wpf/RelayCommand.cs – xvdiff

+2

Только причина была бы, если делегат CanExecute возвращает false для DoSomethingCoolCommand, но вы не предоставили этот делегат. Поэтому всегда должно быть правдой. Это полный код? У вас есть делегат CanExecute или у вас есть шаблон по умолчанию, определенный для кнопки в приложении? –

ответ

0

Вы проверили, нет ли у какого-либо из родителей кнопок состояния, которые отключены? Это также отключит все дочерние элементы управления.

На боковой ноте:

Вы никогда, кажется, называют CommandManager.InvalidateRequerySuggested() и это не реализовано в RelayCommand´ class, just the registration of events, as seen [here][1]. ICommand or RelayCommand never does invalidate update it's state by default. You got to do this. Either by calling CommandManager.InvalidateRequerySuggested() `, который предложит перезапроса всех зарегистрированных команд (так как действие кнопки 1, может имеет влияние на многих других командах.

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

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