WPF: Textbox и привязка к Double не могут вводить. на нем

У меня есть текстовое поле, как

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

и я принял "TransactionAmount" как Double. Он хорошо работает с целочисленным значением, но когда я набираю значение с плавающей запятой, например 100.456, я не могу ввести ".'

3 ответов


вы обновляете свое свойство при каждом изменении значения. Когда вы вводите ., он записывается в вашу viewmodel и представление обновляется.

например, если вы введете в 100. округлено до 100, таким образом, вы никогда не увидите точки.

у вас есть несколько вариантов, чтобы изменить это поведение:

используйте отложенную привязку:

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

измените значение, только если оно отличается от сохраненного (Я бы рекомендовал это для каждого binding):

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

или использовать какую-то проверку, например ValidatesOnExceptions.


лучшее решение, которое я получил, используя StringFormat как

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

Также мы можем пойти для изготовленного на заказ формата строки согласно требованиям


ваша проблема связана с UpdateSourceTrigger. Вместо использования там Вы можете использовать что-то вроде этого,

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

PropertyChanged () вы получите это от INotifyPropertyChanged. Для получения дополнительной информации нажмите здесь https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs. 110).aspx