Конвертер текстового поля wpf для удвоения в сочетании с updatesourcetrigger = propertychanged

В нашем проекте у нас есть текстовое поле 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.
Возможно ли это? Или есть другое решение нашей проблемы?


person user2039673    schedule 11.02.2013    source источник


Ответы (1)


Да, поведение изменилось с .Net 3.5 на .Net 4.0, где теперь он отправляет исходные обновления обратно в целевые объекты, даже если обновления исходят из целевого объекта. Этот пост SO немного объясняет это и предлагает решение:

Почему настройка привязки ведет себя иначе в .NET 4 против .NET 3.5

Вот варианты, которые я нашел до сих пор, чтобы справиться с этим:

  • Попросите конвертер поддерживать состояние ввода в ConvertBack и восстанавливать его в Convert (предлагается по ссылке выше)
  • Измените данные резервного копирования на строки, обработайте преобразование в модели
  • Создайте настраиваемый элемент управления, который обрабатывает этот вид числового ввода аналогично тому, как работает DateTimePicker (он поддерживает строковое и двойное представление данных; отображает строку, но привязан к двойному)
person Jacob    schedule 25.04.2013
comment
Спасибо, я закончил создание кастомного элемента управления;) - person user2039673; 17.06.2013