2015-05-19 6 views
7

habe ich ein Textfeld wieWPF: Textfeld und Bindung an Double kann nicht eingegeben werden. auf sie

<TextBox Text="{Binding TransactionDetails.TransactionAmount, Mode=TwoWay, 
UpdateSourceTrigger=PropertyChanged}" Grid.Column="3" Grid.ColumnSpan="2" Grid.Row="5" 
x:Name="TextBoxAmount"/> 

Und ich habe „transactionAmount“ als Doppel genommen. Es funktioniert gut auf Integer-Wert, aber wenn ich etwas Fließkommawert wie 100.456 tippe, kann ich '.'

+0

ich das Verhalten nicht reproduzieren kann. Kannst du gerade genug Code hinzufügen, damit ich es ausprobieren kann? –

+0

Die TransactionDetails sind meine Enyity und TransactionAmount ist die Eigenschaft meiner Entität wie private double _transactionAmount; öffentliches Double TransactionAmount { get {return _transactionAmount; } set {_transactionAmount = Wert; Benachrichtigen ("TransactionAmount"); } } –

+0

Ich kann es immer noch nicht reproduzieren. Bitte besorge mir meinen Code und probiere es in einem neuen Projekt aus: http://pastebin.com/yVPCKG30 –

Antwort

3

Sie aktualisieren Ihre Eigenschaft jedes Mal, wenn sich der Wert ändert. Wenn Sie einen . eingeben, wird es in Ihr Ansichtsmodell geschrieben und die Ansicht wird aktualisiert.

z.B. Wenn Sie eingeben, wird es auf 100 gerundet, so dass Sie keinen Punkt jemals sehen werden.

Sie haben einige Möglichkeiten, dieses Verhalten zu ändern:

Verwendung einer Bindung latenten:

<TextBox Text="{Binding Path=TransactionDetails.TransactionAmount, 
         Mode=TwoWay, 
         UpdateSourceTrigger=PropertyChanged, 
         Delay=250}" 
     Grid.Column="3" 
     Grid.ColumnSpan="2" 
     Grid.Row="5" 
     x:Name="TextBoxAmount" /> 

nur den Wert ändern, wenn es sich von der gespeicherten eines (ich dies für jeden empfehlen würde Bindung):

private double _transactionAmount; 
public double TransactionAmount 
{ 
    get { return _transactionAmount; }  
    set 
    { 
    if (_transactionAmount != value) 
    { 
     _transactionAmount = value; 
     Notify("TransactionAmount"); 
    } 
    } 

oder verwenden Sie eine Art von Validierung, z ValidatesOnExceptions.

+0

Danke, ich habe Ihren Punkt. Jetzt funktioniert es –

1

Ihr Problem ist mit UpdateSourceTrigger. Stattdessen verwenden Sie so etwas wie dieses verwenden können,

private double amount; 
public double Amount 
    { 
     get 
     { 
      return amount; 
     } 
     set 
     { 
      amount= value; 
      PropertyChanged(); 
      Calculation(); 
     } 
    } 

Property() Sie werden diese von INotifyPropertyChanged erhalten. Für weitere Informationen klicken Sie hier https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

+0

Wenn ich "UpdateSourceTrigger" lösche, funktioniert meine Benachrichtigung nicht. Auf dem ich eine mathematische Berechnung mache –

+0

Notify wird erst nach dem Textfeld lostfocus ausgelöst. –

+0

Eigentlich habe ich mehrere textboxes.On Eigenschaft geändert von jedem Textfeld berechnet ich Addition und Prozentsätze –

3

Die beste Lösung, die ich unter Verwendung StringFormat wie

bekam
<TextBox Text="{Binding TransactionDetails.TransactionAmount, Mode=TwoWay, 
UpdateSourceTrigger=PropertyChanged,StringFormat=N2}" Grid.Column="3" 
Grid.ColumnSpan="2" Grid.Row="5" x:Name="TextBoxAmount" /> 

Auch wir können wie pro Anforderungen für benutzerdefinierte Zeichenfolge-Format gehen