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.
Vous devez vous connecter pour publier un commentaire.
Il est plus que probable que le contrôle est de ne jamais demander de l' CanExecute état nouveau. Vous devez appeler la RaiseCanExecuteChanged méthode sur DelegateCommand chaque fois que vous le détecter une condition que les modifications de la commande CanExecute état. Cela signale le contrôle lié à la mise à jour de la CanExecute état.
RaiseCanExecuteChanged
méthode parce que j'ai été en utilisant l'interface ICommand. Cette méthode est définie dans le DelegateCommand mise en œuvre, donc j'avais besoin de le jeter.Code pour RaiseCanExecuteChanged:
De départ avec Prism6 la
DelegateCommand
peut "observer" votre propertys. Signifie à chaque fois que votre propriété est en train de changer le CanExecute-la Méthode est appelée. La bonne chose est que vous vous débarrasser deRaiseCanExecuteChanged
dans le Propertysetter. Vous pouvez également la chaîne d'-appeler cette méthode si vous voulez voir plus de propriétés:En outre, si vous voulez que vos DelegateCommand être appelés en fonction de l'état d'une propriété booléenne que vous pouvez utiliser
.ObservesCanExecute(()=> BoolProp)
Vous n'avez pas besoin de
this.CanLoginExecute
plus.Voici une petite solution de contournement pour le Prisme (testé avec Prism.Core 7.1.0.431):