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