Je code un UserControl de connexion simple avec deux TextBox (nom d'utilisateur et mot de passe) et un bouton de connexion. Je veux que le bouton de connexion soit activé seulement quand les champs de nom d'utilisateur et de mot de passe sont remplis. J'utilise Prism et MVVM. Le LoginViewModel contient une propriété appelée LoginCommand qui est liée au bouton de connexion. J'ai une méthode CanLoginExecute() dans mon ViewModel mais elle ne se déclenche que lorsque l'application arrive et plus jamais. Le bouton de connexion n'est donc jamais activé. Qu'est-ce que je rate?Méthode WPF-Prism CanExecute non appelée
Voici mon 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
}
Quelle est cmnd: Click.Command =, est-il quelque chose de spécifique Prism. Je fais habituellement
Oui, cmnd: Click.Command = est spécifique prisme: xmlns: cmnd = "clr-namespace: Microsoft.Practices.Composite.Presentation.Commands; assemblage = Microsoft.Practices.Composite.Presentation" Depuis que je suis en utilisant Je pensais que le DelegateCommand de Prism serait le mécanisme de liaison de commande compatible. J'ai aussi essayé directement Command = "{Binding LoginCommand}" - cela fonctionne exactement de la même manière. – Naresh