2009-09-30 13 views
2

J'ai un formulaire de connexion qui contient une zone de saisie de nom d'utilisateur et une zone de mot de passe.Utilisation de MultiBinding pour lier des éléments

Je souhaite que le bouton OK soit activé uniquement lorsque les deux champs contiennent une valeur.

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

J'ai placé un point d'arrêt sur la première ligne de la méthode Convert, et il s'arrête uniquement lorsque le MenuItem initialise, par la suite, c'est-à-dire lorsque je modifie le texte.

L'exemple suivant fonctionne bien, le problème est que la liaison multiple n'est pas déclenchée lorsque je change de 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"

Tout. idées?

+0

Pouvez-vous ajouter le code XAML pour vos contrôles tbUserName et tbPassword, et pour la déclaration de la ressource TrueForAllConverter? –

+0

Je pense que Jerry est sur la bonne voie. Vous devez ajouter l'attribut UpdateSourceTrigger aux liaisons sur vos TextBoxes, de sorte que MultiBinding soit notifié lors de la modification plutôt que seulement lorsque le focus quitte les contrôles. –

+0

Je ne répondrais pas si je ne voudrais pas rey et voir que cela ne fonctionne pas. en ce qui concerne le TrueForAllConverter J'ai placé un point de rupture au dessus de la méthode Convert, il s'arrête seulement quand le MenuItem s'initialise, donc nous ne nous soucions pas de ce qu'il y a dans le convertisseur, nous devrions d'abord essayer de l'atteindre. Si vous êtes vraiment curieux de savoir ce que le convertisseur me dit et je l'afficherai même si je pense que sa place n'est pas là. – Shimmy

Répondre

2

Je vous suggère de regarder dans la liaison de commande. Une commande peut activer ou désactiver votre bouton de connexion automatiquement en fonction de certaines conditions (par exemple, le nom d'utilisateur et le mot de passe ne sont pas vides).

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 contraignant ressemble à quelque chose comme ça

<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 here.

+0

+1 ... cela peut sauver des gens un peu de recherche si vous mentionnez aussi que la raison pour laquelle la commande de liaison est la manière de le faire est que la propriété * Password * sur le * PasswordBox * n'est pas une propriété de dépendance et doesn Ne notifie pas qu'il a changé. [Voici un bon article de blog] (http://blog.functionalfun.net/2008/06/wpf-passwordbox-and-data-binding.html) sur ce problème particulier. – slugster

0

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.

+0

J'ai essayé ce qui précède et cela ne fonctionne pas. – Shimmy

0
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