2016-10-23 14 views
-1

У меня есть мнение всплывающего с x:Name=This, на нем кнопку delcared следующим образом:Почему моя кнопка входа всегда отключена?

<Button Content="Log in" Command="{Binding Path=LoginCommand}" CommandParameter="{Binding ElementName=This}" /> 

Это, чтобы получить доступ к не-привязываемому Password собственности, которая является SecureString типом.

В моем CTOR я инициализирую команду так:

public LoginPopupViewModel() 
{ 
    LoginCommand = new DelegateCommand<IHavePassword>(
     LogUserIn, 
     p => !string.IsNullOrWhiteSpace(Username)); 
} 

Я ожидаю, что, когда я что-то типа в Username и изменении фокуса, уведомление об изменении свойств позволит кнопку Входа помочь. Это не так, поэтому я добавил дополнительный код, и кнопка все еще остается отключенной.

public string Username 
{ 
    get { return _username; } 
    set 
    { 
     if (value == _username) return; 
     _username = value; 
     OnPropertyChanged(); 
     CommandManager.InvalidateRequerySuggested(); 
    } 
} 

Если изменить CanExecute делегата, как показано ниже, только тогда включена кнопка:

public LoginPopupViewModel() 
{ 
    LoginCommand = new DelegateCommand<IHavePassword>(
     LogUserIn, 
     p => true); 
} 

Почему эта кнопка останется запрещенным даже тогда, когда его команда может выполнить?

ответ

1

Я пробовал пример программы и привязки, кажется, работает нормально. У меня нет вашего полного исходного кода, но вам нужно использовать команду RaiseCanExecuteChanged в команде делегата, если вы хотите, чтобы команда проверила, нужно ли ее выполнять. Вы проверили, правильно ли привязано имя пользователя? this.loginCommand.RaiseCanExecuteChanged(); является ключом к ответу

public LoginPopupViewModel() 
 
     { 
 
      this.loginCommand = new DelegateCommand(() => 
 
      { 
 
       MessageBox.Show("Logged In Click"); 
 
      },() => 
 
      { 
 
       return !string.IsNullOrEmpty(UserName); 
 
      }); 
 
     } 
 

 
     private DelegateCommand loginCommand; 
 
     private string userName; 
 

 
     public ICommand LoginCommand 
 
     { 
 
      get { return loginCommand; } 
 
     } 
 

 
     public string UserName 
 
     { 
 
      get { return this.userName; } 
 
      set 
 
      { 
 
       if (value == this.userName) 
 
       { 
 
        return; 
 
       } 
 
       this.userName = value; 
 
       OnPropertyChanged("UserName"); 
 
       this.loginCommand.RaiseCanExecuteChanged(); 
 
      } 
 
     } 
 

 
     public string Password { get; set; }

+0

Параметр 'RaiseCanExecuteChanged' работал отлично, спасибо. Сначала я не нашел его, потому что мои команды были объявлены как 'ICommand', а не' DelegateCommand'. – ProfK