Я только что обновил наше приложение wpf с 3.5sp1 до 4.0.
Код ниже мы используем для привязки текстового поля к базовой модели представления.Текстовое поле доступно для редактирования.
<TextBox HorizontalContentAlignment="Right"
Text="{Binding Path=Price, StringFormat={0:#,##0;(#,##0)}, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=True}"/>
В 3.5sp1 форматирование будет происходить только изначально.Поэтому, когда текстовое поле было загружено и привязано к значению 4000, форматирование изменило бы его на 4000.Если пользователь отредактировал это значение, форматирование не произошло бы.
В 4.0 форматирование происходит при изменении значения (т. Е. Пока пользователь вводит новое значение).Хотя в теории это звучит нормально, в действительности это катастрофа.Курсор повсюду.Его невозможно использовать.
Теперь мы можем изменить UpdateSourceTrigger на «LostFocus», но это создает новые проблемы с данными, которые не проверяются в определенных сценариях.
Есть ли способ получить старый 3.5sp1поведение назад?
Обновление 1
Использование конвертера по-прежнему вызывает то же поведение:
public class DecimalConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null)
return ((decimal)value).ToString("#,##0;(#,##0)");
return string.Empty;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}
и измененный XAML:
<TextBox Text="{Binding Path=Price, Converter={StaticResource DecimalConverter}, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=True}"/>
Обновление 2
Аналогично этому подключить статью .