2016-10-23 41 views
-1

我有一個彈出視圖與x:Name=This,在其上delcared作爲一個按鈕如下:爲什麼我的登錄按鈕一直被禁用?

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

這是爲了獲得對非綁定Password屬性,這是一個SecureString類型。

在我的構造函數初始化我的命令,像這樣:

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

相關問題