2015-08-29 2 views
0

Je commence par le motif MVVM et j'ai un problème avec la commande de mon bouton. J'ai une fenêtre qui contient un TextBox pour la connexion et un PasswordBox personnalisé avec le mot de passe DependencyProperty pour le mot de passe (je sais que n'importe quel mot de passe ne devrait pas être gardé en mémoire, cependant c'est seulement pour le plaisir, ainsi ne soyez pas frustré :)). Il y a aussi un bouton et je veux qu'il soit activé si et seulement si le login et le mot de passe ne sont pas vides. Cependant, ma commande ne fonctionne pas correctement. Voici le code:ICommand ne fonctionne pas

LoginWindow XAML:

<Window x:Class="WpfMVVMApplication1.LoginWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:WpfMVVMApplication1" 
    xmlns:vm="clr-namespace:WpfMVVMApplication1.ViewModel" 
    mc:Ignorable="d" 
    Title="Login" WindowStartupLocation="CenterScreen" ResizeMode="NoResize" 
    Width="250" Height="150"> 
<Window.DataContext> 
    <vm:LoginViewModel /> 
</Window.DataContext> 
<Window.Resources> 
    <!-- here some styles for controls --> 
</Window.Resources> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="1.5*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <TextBlock Text="Login:"/> 
    <TextBlock Text="Password:" Grid.Row="1"/> 
    <TextBox Text="{Binding Login, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/> 
    <local:MyPasswordBox Grid.Row="1" PasswordText="{Binding Password, Mode=TwoWay}"/> 
    <Button Command="{Binding SaveUserCommand}"/> 
</Grid> 

Ma classe LoginViewModel

public class LoginViewModel : INotifyPropertyChanged 
{ 
    public LoginViewModel() 
    { 
     SaveUserCommand = new Command(x => SaveUser(), x => { return !string.IsNullOrEmpty(Login) && !string.IsNullOrEmpty(Password); }); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public ICommand SaveUserCommand { get; private set; } 

    private string login; 
    private string password; 
    public string Login 
    { 
     get 
     { 
      return login; 
     } 
     set 
     { 
      login = value; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Login")); 
     } 
    } 

    public string Password 
    { 
     get 
     { 
      return password; 
     } 
     set 
     { 
      password = value; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Password")); 
     } 
    } 

    public void SaveUser() { } 
} 

classe également MyPasswordBox peut être utile:

<UserControl x:Class="WpfMVVMApplication1.MyPasswordBox" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:WpfMVVMApplication1" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<Grid> 
    <PasswordBox x:Name="password" PasswordChanged="password_PasswordChanged"/> 
</Grid> 

0 J'ai écrit des tests unitaires pour ce qui vérifie le résultat de la méthode SaveUserCommand CanExecute et ils ont tous passé. En outre, je lance le débogage dans Visual Studio en ajoutant des points d'arrêt dans les setters des propriétés Login et Password et tous les deux sont correctement définis. Je n'ai plus d'idées sur ce que je pourrais faire de mal. Quelqu'un peut-il m'aider?

Je sens que je n'effectueraient pas la commande sur les changements correctement, mais je ne sais pas comment faire

Répondre

1

Pour WPF pour ramasser un changement si une commande peut être exécutée, la L'événement CanExecuteChanged de la commande doit être déclenché.

Vous devrez déclencher cet événement lorsque le nom d'utilisateur ou le mot de passe changera. Vous n'avez pas montré la source de votre classe Command, mais il faudra qu'une méthode déclenche son événement CanExecuteChanged. Ensuite, appelez simplement cette méthode à partir des paramètres Login et Password.

+0

Cela fonctionne parfaitement! Merci beaucoup. – bakala12