2010-03-11 3 views
2

J'essaie de modifier la propriété IsEnabled d'un bouton si la validation de certaines des zones de texte de mon formulaire est vraie. Donc, s'il y a des erreurs, la propriété IsEnabled doit être définie sur false.Implémentation de IDataErrorInfo & databinding

Pour une raison quelconque, je ne peux pas le faire fonctionner. L'implémentation IDataErrorInfo est appelée uniquement après l'appel de ma propriété IsEmailValid, donc Validation.GetHasError renvoie toujours false et mon bouton n'est jamais désactivé.

Quelqu'un peut-il aider?

code:

validé avec Textbox IDataErrorInfo

<TextBox Style="{StaticResource textBoxInError}" Name="txtEmail" Grid.Column="1" Grid.Row="2" Width="150" Height="23" HorizontalAlignment="Right" VerticalAlignment="Center"> 
      <TextBox.Text> 
       <Binding Path="Email" Mode="TwoWay" 
         ValidatesOnDataErrors="True" 
         UpdateSourceTrigger="LostFocus" 
         ></Binding> 
      </TextBox.Text> 
     </TextBox> 

IDataErrorInfo Mise en œuvre:

public string Error 
     { 
      get 
      { 
       return null; 
      } 
     } 

     public string this[string name] 
     { 
      get 
      { 
       string result = null; 
       #region Email 
       if (name == "Email") 
       { 
        if (!presenter.LenientValidateEmail(Email)) 
        {      
         result = "Your email address is not valid"; 

        } 

       } 
       #endregion 

       #region Website 

       #endregion 
       return result; 
      } 
     } 

Bouton lie IsEnabled

<Button Name="btnUpdate" IsEnabled="{Binding IsValid}" HorizontalAlignment="Left" Grid.Column="3" Grid.RowSpan="2" Grid.Row="6" Height="23" Width="75" Click="btnUpdate_Click">Update 
     </Button> 

public bool IsValid 
     { 
      get 
      { 
       return IsEmailValid(); 
      } 
     } 



public string Email 
     { 
      get 
      { 
       return _email; 
      } 
      set 
      { 
       _email = value; 
       OnPropertyChanged("Email"); // executes before IDataErrorInfo Implementation 
      } 
     } 




private bool IsEmailValid() 
    { 
     object el = FindName("txtEmail"); 


     if (el != null) 
     { 
      _isEmailValid = Validation.GetHasError((DependencyObject)el); // always false?? 

      if (_isEmailValid) 
      { 
       return false; 
      } 
      else 
       return true; 
     } 
     return true; 

    } 

//PropertyChanged event handler: 
    void ProfileView_PropertyChanged(object sender, PropertyChangedEventArgs e) 
      { 
       IsEmailValid(); 
      } 

Répondre

1

Je l'ai résolu. En utilisant un dictionnaire pour garder une trace de toutes les erreurs générées par IDataErrorInfo, puis dans IsEmailValid(), validez l'adresse e-mail. Ensuite, ajoutez/supprimez l'erreur du dictionnaire si l'email est ou n'est pas valide !! :)

3

Lorsque I und Je comprends que vos extraits de code correctement, je pense que le problème est que l'interface utilisateur n'est pas averti lorsqu'une adresse email invalide a été entré. Dans ProfileView_PropertyChanged (...), vous vérifiez que l'e-mail est valide et, s'il n'est pas valide, IsEmailValid() doit renvoyer false. Cependant, rien n'est fait avec ce résultat; le plus important: l'interface utilisateur n'est pas avertie de la modification de la propriété IsValid et, par conséquent, l'état IsEnabled du bouton n'est pas mis à jour. Certainement, la valeur de retour de la propriété IsValid changerait après qu'un eMail invalide a été entré, mais l'interface utilisateur ne demande pas cette nouvelle valeur.

La solution doit être d'augmenter l'événement PropertyChanged pour la propriété IsValid dans la méthode ProfileView_PropertyChanged (...), comme ceci:

void ProfileView_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    IsEmailValid(); 
    OnPropertyChanged("IsValid"); // <== this one is important! 
} 

Vous pouvez également envelopper le OnPropertyChanged (...) remettre en une instruction if, en fonction du résultat de IsEmailValid(), mais c'est à vous de décider.

En fait, vous n'avez même pas besoin de l'appel à la méthode IsEmailValid() car il sera appelé immédiatement après l'événement PropertyChanged. Cependant, je ne voulais pas l'enlever parce que je ne sais pas si cela pourrait introduire une autre erreur dans votre application.