2015-05-19 8 views
7

ho una casella di testo comeWPF: Textbox e binding a Double non in grado di digitare. su di esso

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

E ho preso "TransactionAmount" come doppio. Funziona bene sul valore intero ma quando digito un valore in virgola mobile come 100.456 non riesco a digitare '.'

+0

non riesco a riprodurre il problema. Puoi aggiungere abbastanza codice in modo che io possa provarlo? –

+0

TransactionDetails è my enyity e TransactionAmount è la proprietà della mia entità come private double _transactionAmount; public double TransactionAmount { get {return _transactionAmount; } set {_transactionAmount = value; Notifica ("TransactionAmount"); } } –

+0

Non riesco ancora a riprodurlo. Si prega di ottenere il mio codice e provarlo in un nuovo progetto: http://pastebin.com/yVPCKG30 –

risposta

3

Si sta aggiornando la proprietà ogni volta che il valore cambia. Quando si digita un ., questo viene scritto nel viewmodel e la vista viene aggiornata.

ad es. se si digita 100. viene arrotondato a 100, quindi non si vedrà mai alcun punto.

Avete alcune opzioni per modificare questo comportamento:

uso una differita vincolante:

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

cambia solo il valore se è diversa da quella salvata (vi consiglio questo per ogni vincolante):

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

o utilizzare un tipo di convalida, ad es. ValidatesOnExceptions.

+0

Grazie ho ottenuto il tuo punto.Ora il suo funzionamento –

1

Il tuo problema è con UpdateSourceTrigger. Invece di usare lì si può usare qualcosa di simile,

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

PropertyChanged() si ottiene questo da INotifyPropertyChanged. Per maggiori informazioni clicca qui https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

+0

Se sto cancellando "UpdateSourceTrigger" la mia notifica non funziona. Su cui sto facendo alcuni calcoli matematici –

+0

Notifica si innescherà solo dopo la casella di testo lostfocus. –

+0

In realtà ho più caselle di testo. Su una proprietà modificata di ogni casella di testo che sto calcolando addizione e percentuali –

3

La soluzione migliore ho ottenuto utilizzando StringFormat come

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

Inoltre possiamo andare per il formato stringa personalizzata secondo le esigenze