Question

I ai un formulaire d'ouverture de session qui contient une zone de texte de nom d'utilisateur et une zone de mot de passe.

Je veux que le bouton OK pour être activé uniquement lorsque les deux champs contiennent une valeur.

J'ai un convertisseur pour vérifier toutes les chaînes si elles sont nulles ou vides.

Je mis un point d'arrêt sur la première ligne de la méthode Convert, et il arrête que lorsque le MenuItem initialise, postfaces, à savoir quand je change le texte, il ne fonctionne pas.

L'exemple suivant fonctionne bien, le problème est que le MultiBinding ne se déclenche pas lorsque je change le texte; il est seulement lié lors de l'initialisation de la forme:

<!--The following is placed in the OK button-->
<Button.IsEnabled>
    <MultiBinding Converter="{StaticResource TrueForAllConverter}">
        <Binding ElementName="tbUserName" Path="Text"/>
        <Binding ElementName="tbPassword" Path="Password"/>
    </MultiBinding>
</Button.IsEnabled>

Je pense que le problème est que vous ne soyez pas averti lorsque est changé la source distante de liaison (par exemple il n'y a pas une option pour définir UpdateTargetTrigger="PropertyChanged".

Toutes les idées?

Était-ce utile?

La solution

Je vous suggère de regarder dans la commande obligatoire. Une commande peut activer ou désactiver le bouton de connexion automatiquement en fonction de certaines conditions (ie. Nom d'utilisateur et mot de passe est vide).

public static RoutedCommand LoginCommand = new RoutedCommand();

private void CanLoginExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = !string.IsNullOrEmpty(_userInfo.UserName) && !string.IsNullOrEmpty(_userInfo.Password);
    e.Handled = true;
}

private void LoginExecute(object sender, ExecutedRoutedEventArgs e)
{
    MessageBox.Show("Loging in...");
    // Do you login here.
    e.Handled = true;
}

commande XAML lier ressemblera à quelque chose comme ceci

<TextBox Text="{Binding UserName, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Text="{Binding Password, UpdateSourceTrigger=PropertyChanged}" />
<Button Command="local:LoginWindow.LoginCommand" >Login</Button>

Pour enregistrer la commande en XAML

<Window.CommandBindings>
    <CommandBinding Command="local:LoginWindow.LoginCommand" CanExecute="CanLoginExecute" Executed="LoginExecute" />
</Window.CommandBindings>

Ou dans le code derrière

public LoginWindow()
{
    InitializeComponent();

    CommandBinding cb = new CommandBinding(LoginCommand, CanLoginExecute, LoginExecute);
    this.CommandBindings.Add(cb);
}

Plus readigin .

Autres conseils

Private Sub tb_Changed(sender As Object, e As RoutedEventArgs) _
        Handles tbUsername.TextChanged, _
                tbPassword.PasswordChanged
    btnOk.IsEnabled = tbUsername.Text.Length > 0 _
              AndAlso tbPassword.Password.Length > 0
End Sub

Essayez de régler le UpdateSourceTrigger à PropertyChanged et Mode à TwoWay. Cela entraînera la propriété à être mis à jour que vous tapez. Je ne sais pas si cela va fonctionner avec votre convertisseur, cependant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top