Я только что обновил наше приложение 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
Использование Converter по-прежнему реализует одно и то же поведение:
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
Подобно этому соединить статью.