2009-07-11 4 views
0

J'ai un fichier .xaml et un fichier .cs qui partagent la valeur avec Binding.Problème de liaison WPF avec la mise à jour des valeurs

Pour simplifier, j'ai 1 bouton et 1 zone de texte. Je veux que le bouton soit désactivé lorsque le texte de la zone de texte n'a pas de caractère.

Voici les deux codes du XAML pour la liaison:

<TextBox Name="txtSend" Text="{Binding Path=CurrentText,UpdateSourceTrigger=PropertyChanged}"></TextBox> 
    <Button IsEnabled="{Binding Path=IsTextValid}" Name="btnSend">Send</Button> 

Les deux propriétés dans le fichier .cs ressemblent à ce que:

public string CurrentText 
    { 
     get 
     { 
      return this.currentText; 
     } 
     set 
     { 
      this.currentText = value; 
      this.PropertyChange("CurrentText"); 
      this.PropertyChange("IsTextValid"); 
     } 
    } 

    public bool IsTextValid 
    { 
     get 
     { 
      return this.CurrentText.Length > 0; 
     } 
    } 

Le this.PropertyChanged est tout simplement une méthode qui appelle PropertyChanged à partir de INotifyPropertyChanged.

Le problème est que je dois appeler le this.PropertyChange("IsTextValid"); dans le Setter du CurrentText pour pouvoir changer l'état du bouton.

Question 1) Est-ce la bonne façon de le faire ... si les règles deviennent plus complexes, il se peut que je doive appeler beaucoup de PropertyChanged ...?

Question 2) Mon bouton est activé lorsque le formulaire est chargé. Comment puis-je faire vérifier la méthode depuis le début?

Répondre

2

Question 1: Ceci est correct. Il n'y a aucun problème à le faire. Cependant, vous pouvez jeter un oeil à la validation en utilisant IDataErrorInfo. (Recherche Google, et vous trouverez beaucoup de bons exemples)

Question 2: assurez-vous que votre chaîne "currentText" est initialisée avec string.empty. Parce que si vous ne l'avez pas initialisé, il sera null, et le getter pour IsTextValid lèvera une exception, et WPF échouera à récupérer la valeur.

Ou faire comme ça:

public bool IsTextValid 
{ 
    get 
    { 
     return ! string.IsNullOrEmpty(this.CurrentText); 
    } 
} 
+0

+1 et réponse acceptée :) +25 reps pour vous mon ami. Je vous remercie. –

0

Votre façon de le faire est correct. Si vous êtes un peu paresseux (comme je suis), vous devriez jeter un oeil sur le paquet NuGet Fody.PropertyChanged.

Votre code simplifierait à

public string CurrentText { get; set; } 

public bool IsTextValid { get { return this.CurrentText.Length > 0; } } 

Fody.PropertyChanged fait le reste pour vous. Il ajoute automatiquement les instructions nécessaires pour notifier que CurrentText a changé, et il détecte même que IsTextValid dépend de CurrentText et avertit pour cela aussi.

Questions connexes