обновление целого числа инструментария wpf не сохраняет значения при lostfocus

#wpftoolkit #lostfocus

#wpftoolkit #lostfocus

Вопрос:

У меня есть элемент управления wpf toolkit с целочисленным обновлением. Я могу изменять значения с помощью клавиш со стрелками и вводить их явно. Но после изменения значения, если я уберу фокус, значение станет равным нулю.

Будем признательны за любую помощь. Спасибо!

  <wpftlkit:IntegerUpDown Grid.Column="1" Margin="6" VerticalAlignment="Center" Increment="1" Maximum="7"
                         Value="{Binding ValueH,   Mode=TwoWay, UpdateSourceTrigger=LostFocus}"                              Style="{StaticResource StyleErrorTemplate}"
                        IsEnabled="{Binding IsEnabled}" Visibility="{Binding Visibility}" />
  

Комментарии:

1. Вы должны показать код для DataContext — в частности, свойство «ValueH»…

Ответ №1:

Я подозреваю, что проблема связана с привязкой. Фактическое значение не обновляется до тех пор, пока вы не потеряете фокус (из-за вашего UpdateSourceTrigger), и в этот момент нарушенная привязка или привязка к свойству, которое возвращает значение к нулю, приведет к такому поведению.

Комментарии:

1. Произойдет ли это при ошибке проверки данных в «ValueH». (Я имею в виду проверку. Ошибка hasError истинна)?

2. @Relativity Поведение по умолчанию, прямо сейчас, поскольку вы не показываете в Xaml ничего, что можно было бы сделать по-другому (красная рамка). Я бы рекомендовал прочитать: blogs.msdn.com/b/bethmassi/archive/2008/06/27 /…

Ответ №2:

Так работает инструментарий. Чтобы изменить значение на максимальное или минимальное, когда пользователь вводит значение, выходящее за пределы Min-Max, вам следует загрузить исходные тексты WPF Toolkit (http://wpftoolkit.codeplex.com/SourceControl/changeset/view/98195 ) и измените файл CommonNumericUpdown.cs в папке Xceed.Wpf.Toolkit/NumericUpDown/NumericUpDown, как указано ниже. Обратите внимание на строки перед выбрасыванием исключений, они добавляются.

 private void ValidateDefaultMinMax( T? value )
{
  // DefaultValue is always accepted.
  if( object.Equals( value, DefaultValue ) )
    return;

  if (IsLowerThan(value, Minimum))
  {
      Value = Minimum;
      throw new ArgumentOutOfRangeException("Minimum", String.Format("Value must be greater than MinValue of {0}", Minimum));
  }
  else if (IsGreaterThan(value, Maximum))
  {
      Value = Maximum;
      throw new ArgumentOutOfRangeException("Maximum", String.Format("Value must be less than MaxValue of {0}", Maximum));
  }
}