WPF-Prisme CanExecute méthode n'est pas appelée

Je suis le codage d'un simple login UserControl avec deux zones de texte (nom d'utilisateur et Mot de passe) et un bouton de Connexion. Je veux que le bouton se connecter pour être activée que lorsque le nom d'utilisateur et le mot de passe champs sont remplis. Je suis l'aide de Prism et de MVVM. Le LoginViewModel contient une propriété appelée LoginCommand qui est lié au bouton de Connexion. J'ai un CanLoginExecute() la méthode dans mon ViewModel, mais il se déclenche uniquement lorsque l'application est en place et plus jamais ensuite. Si le bouton de Connexion n'est jamais activé. Ce qui me manque?

Voici mon code xaml:

<TextBox x:Name="username"
    Text="{Binding Path=Username, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
<TextBox x:Name="password"
    Text="{Binding Path=Password, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
<Button Content="Login"
    cmnd:Click.Command="{Binding LoginCommand}" />

Voici mon ViewModel

class LoginViewModel : IDataErrorInfo, INotifyPropertyChanged
{
public LoginViewModel()
{
this.LoginCommand =
new DelegateCommand<object>(
this.LoginExecute, this.CanLoginExecute);
}
private Boolean CanLoginExecute(object dummyObject)
{
return (string.IsNullOrEmpty(Username) ||
string.IsNullOrEmpty(Password)) ? false : true;
}
private void LoginExecute(object dummyObject)
{
if (CheckCredentials(Username, Password))
{
....
}
}
#region IDataErrorInfo Members
public string Error
{
get { throw new NotImplementedException(); }
}
public string this[string columnName]
{
get
{
string result = null;
if (columnName == "Username")
{
if (string.IsNullOrEmpty(Username))
result = "Please enter a username";
}
else if (columnName == "Password")
{
if (string.IsNullOrEmpty(Password))
result = "Please enter a password";
}
return result;
}
}
#endregion //IDataErrorInfo Members
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion //INotifyPropertyChanged Members
#region Properties
private String _username;
public String Username
{
get { return _username; }
set
{
if (value == _username)
return;
_username = value;
this.OnPropertyChanged("Username");
}
}
private String _password;
public String Password
{
get { return _password; }
set
{
if (value == _password)
return;
_password = value;
this.OnPropertyChanged("Password");
}
}
public ICommand LoginCommand { get; private set; }
#endregion //Properties
}
  • Qu'est-ce que cmnd:Cliquez sur.Commande= , Est-il quelque chose de Prisme spécifique. J'ai l'habitude de faire <Bouton de Commande="{Binding LoginCommand}" Et canexecute fonctionne pour moi.
  • Oui, cmnd:Cliquez sur.Commande= prism spécifiques: xmlns:cmnd="clr-namespace:Microsoft.Practices.Composite.Presentation.Commands;assembly=Microsoft.Practices.Composite.Presentation" Depuis que je suis à l'aide du Prisme de DelegateCommand, je pensais que ce serait compatible commande le mécanisme de liaison. J'ai aussi essayé de droite de Commande="{Binding LoginCommand}" - cela fonctionne exactement de la même.
InformationsquelleAutor Naresh | 2010-03-15