2013-02-11 2 views
0

В нашем проекте у нас есть текстовое поле WPF, связанное с двойным. Существует конвертер, который позволяет в конвертировании использовать, например, «.». и «,» в качестве десятичных точек, а в методе преобразования он форматирует двойной формат в n2. Здесь вы можете увидеть simplefied версию нашего конвертера:Конвертер текстовых файлов Wpf, чтобы удвоить в сочетании с updatesourcetrigger = propertychanged

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" /> 

И двойное свойство поднимает PropertyChanged событие:

public double Factor 
    { 
     get { return _factor; } 
     set 
     { 
      _factor = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Factor")); 
     } 
    } 

Это используется отлично работать в предыдущих версиях WPF, потому что конверт не был вызван при вводе текста. Это поведение, по-видимому, изменилось, и теперь метод конвертации вызывается для каждой текстовой записи, в результате чего двойной форматируется при вводе чего-то. Даже если вы не используете форматирование, у вас есть проблема неспособности ввести десятичную точку.

Этого можно решить, не используя UpdateSourceTrigger = Propertychanged, но нам нужно это для проверки. Мы реализуем проверку с помощью IDataErrorInterface. Я знаю, что есть ValidateWithoutUpdate method, но это не работает для проверки с помощью IDataErrorInterface.

Так что мне в основном нужна ConvertBack (и, следовательно, проверка), чтобы произойти OnPropertyChanged и преобразовать только в OnLostFocus.
Возможно ли это? Или есть другое решение для нашей проблемы?

ответ

0

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

Why does binding setup behave differently in .NET 4 vs .NET 3.5

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

  • Имейте преобразователь поддерживать состояние из ввод в ConvertBack и восстановление его в Convert (рекомендуется в ссылке выше)
  • Изменение данных обратной ссылки на строки, преобразование дескриптора в модели
  • Создайте настраиваемый элемент управления, который обрабатывает этот тип числового ввода, аналогичный как работает DateTimePicker (он поддерживает строку и двойное представление данных; отображает строку, но привязана двойным номером)
+0

Спасибо, я закончил создание специального элемента управления;) – user2039673

Смежные вопросы