2010-02-06 6 views
1

J'espère que quelqu'un peut m'aider avec celui-ci, je soupçonne que je fais quelque chose de stupide. J'ai lié un TextBox de sorte que le Text soit lié à InputValue. Fondamentalement, lorsque la valeur du texte change, j'ai une méthode (Inches.Parse), qui examine la valeur et renvoie une chaîne bien formatée.Modifier une valeur de texte lié de zone de texte dans l'accesseur set

S'il n'y a pas d'erreur avec l'analyse, je veux que la zone de texte ait la chaîne bien formatée appelée "résultat". Cependant, le TextBox n'affichera pas le nouveau texte? Toute aide serait appréciée.

public string InputValue 
{ 
    get 
    { 
     return _inputValue; 
    } 
    set 
    { 
     if (_inputValue != value) 
     {           
      bool error; 
      string result = Inches.Parse(value, 64, out error);      

      if (error != IsValid) 
      { 
       IsValid = error; 
      } 
      if (!error) 
      { 
       _inputValue = result; 
      } 
      else 
      { 
       _inputValue = value; 
      } 

      NotifyPropertyChanged("InputValue"); 
     } 
    } 
} 

Répondre

3

C'est un bug/problème qui sera apparemment fixé dans dot net 4.0

Fondamentalement, le problème est que si une liaison définit une propriété de ne cherche pas NotifyPropertyChanged pendant le poseur. Vous pouvez contourner ce problème en appelant le NotifyPropertyChanged sur le thread d'interface utilisateur principal avec un répartiteur. il est fait comme

Application.Current.Dispatcher.BeginInvoke((Action)delegate { NotifyPropertyChanged("InputValue"); }); 

mettre ceci dans votre setter et vous devriez être bien ..

+0

Merci Aran, je vais essayer cela demain et voir ce qui se passe. –

+0

pas de soucis et mauvais jeter un oeil demain au code au travail pour s'assurer que je l'ai eu raison –

+0

vérifié, écrit un projet de test, ci-dessus travaux de syntaxe –

1

Le problème semble être que le TextBox ne sera pas mise à jour de la valeur lors de la mise à jour présentée de la propriété source, il est lié par lui-même.

La solution pourrait consister à définir cette expression de liaison

{Binding Path=InputValue, Mode=TwoWay,UpdateSourceTrigger=Explicit} 

note la UpdateSourceTrigger=Explicit ce dit que vous mettrez à jour la source manuellement

vous ajoutez gestionnaire à TextBox événement LostFocus (donc nous sommes utilisateur que a fini d'éditer)

textBox1.LostFocus += 
(s, e) => 
    { 
    var text = textBox1.Text; 
    [DataSource].InputValue = text; 
    }; 

Ainsi quand TextBox perd s la valeur dans la source de données sera mise à jour et formatée, puis le TextBox sera rebondi.

J'espère que cela vous aidera.

+0

quelques informations sur UpdateSourceTrigger est ici: http://msdn.microsoft.com/en-us/library/ ms752347.aspx –

+0

Merci pour la suggestion. Appréciez-le. –

Questions connexes