2016-10-23 16 views
-1

私のようにdelcaredボタンその上、x:Name=Thisとポップアップビューを持っているが、以下:ログインボタンは常に無効になっていますか?

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

これはSecureStringタイプである非バインド可能Passwordプロパティへのアクセスを獲得することです。

私はそうのようなコマンドを初期化する私の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

私はサンプルプログラムを試して、バインディングが正常に動作しているようです。私はあなたの完全なソースコードを持っていませんが、実行する必要があるかどうかをコマンドがチェックするようにするには、Deleiseコマンドで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'がうまく働いた、感謝です。私の命令は「DelegateCommand」ではなく「ICommand」と宣言されていたので、最初は見つからなかった。 – ProfK

関連する問題