В нашем проекте у нас есть текстовое поле WPF, привязанное к двойному. Существует конвертер, который позволяет, например, при обратном преобразовании использовать оба символа "." и "," как десятичные точки, а в методе convert он форматирует double в числовой формат n2. Вот упрощенная версия нашего конвертера:
public class DoubleConverter:IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null || value.GetType() != typeof(double))
return null;
else
return ((double)value).ToString("n2");
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return null
else
return Double.Parse(((string)value).Replace('.',','));
}
}
Текстовое поле выглядит так:
<TextBox Text="{Binding Path=Factor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" Width="500" Height="50" />
И свойство double вызывает событие propertychanged:
public double Factor
{
get { return _factor; }
set
{
_factor = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Factor"));
}
}
Раньше это нормально работало в предыдущих версиях WPF, потому что преобразование не вызывалось при вводе текста. Это поведение, по-видимому, изменилось, и теперь метод convert вызывается для каждой текстовой записи, в результате чего двойное форматирование форматируется, когда вы что-то вводите. Даже если вы не используете форматирование, у вас есть проблема с невозможностью ввести десятичную точку.
Это можно решить, не используя UpdateSourceTrigger = Propertychanged, но нам это нужно для проверки. Мы реализуем проверку с помощью IDataErrorInterface. Я знаю, что существует ValidateWithoutUpdate, но он не работает для проверки с помощью IDataErrorInterface.
Итак, что мне в основном нужно, так это ConvertBack (и, следовательно, проверка), чтобы происходило OnPropertyChanged, а Convert - только OnLostFocus.
Возможно ли это? Или есть другое решение нашей проблемы?