2010-05-17 5 views
3

J'utilise WPF 4.0 TextBox et la liaison. J'utilise StringFormat pour mettre en forme le nombre comme devise. le XAML ressemble à ceci:étrange Problème avec WPF Textbox stringformat - Curseur recule

<TextBox Text="{Binding Path=ValueProperty, ValidatesOnDataErrors=True, ValidatesOnExceptions=True, StringFormat={}{0:C}, UpdateSourceTrigger=PropertyChanged}"> 
</TextBox> 

Tout semble fonctionner correctement, sauf pour un comportement étrange: Quand, par exemple un utilisateur tape 12: droit après avoir tapé 1, la valeur dans la zone de texte devient 1,00 $ et la chose bizarre est le curseur est déplacé pour être entre le $ et le 1. Ainsi, quand un utilisateur tape simplement 12, le résultat devient 21,00 $.

Comment puis-je corriger ce comportement étrange?

Répondre

10

Je changerais votre UpdateSourceTrigger par défaut (pour TextBox) de LostFocus. En le définissant à PropertyChanged, vous forcez votre validation et le format de chaîne à s'exécuter chaque fois que l'utilisateur tape un caractère.

Cela provoque un comportement très étrange, comme ce que vous voyez.

Si vous laissez la valeur par défaut (ou si vous la définissez sur LostFocus de manière explicite), le formatage + la validation se produira lorsque l'utilisateur aura fini de taper complètement. Cela permettra d'éliminer les problèmes étranges qui se produisent par StringFormat en insérant de nouveaux caractères, la rupture de validation à mi-chemin, et d'autres problèmes que vous rencontrerez en utilisant PropertyChanged.

+0

+1 apt répondre ... – Amsakanna

+6

Alors, que se passe-t-il lorsque vous avez un bouton avec IsDefault défini sur true et que vous tapez une valeur dans et ensuite hit entrer. Typiquement, la valeur ne sera pas poussée et vous perdrez la valeur qui vient d'être entrée. –

1

vous pouvez utiliser ce format de chaîne, il va résoudre ce problème

"$###\,##0.0##" 

votre code devrait ressembler à

<TextBox Text="{Binding Path=ValueProperty, ValidatesOnDataErrors=True, ValidatesOnExceptions=True, StringFormat=$###\,##0.0##, UpdateSourceTrigger=PropertyChanged}"> 
</TextBox> 
0

Ce problème a été corrigé dans .NET 4.5. Pour .NET 4, j'ai dû supprimer StringFormat afin de conserver UpdateSourceTrigger = PropertyChanged