2016-09-23 3 views
0

У меня вопрос несколько любопытный. Я использую «StringFormat = N2». Когда у меня есть значение «1,00», я помещаю курсор за «,» Я нажимаю «backspace» "и число становится волшебным в "100,00". WTF! Мне нужно, чтобы остаться "1,00" Это происходит почти всегда "=" 100,00 "10.000,00" и т.д. и т.п.Проблема с StringFormat «N2» (?

<TextBox Height="40" VerticalContentAlignment="Center" Width="320"> 
    <TextBox.Text> 
     <Binding Path="Weight" 
       StringFormat="N2" 
       ConverterCulture="es-AR" 
       UpdateSourceTrigger="PropertyChanged"> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 
+0

Хмм, когда я удаляю запятую из '1,00', она выглядит как 100 –

+0

@ThomasWeller Thx, пожалуйста, нажмите 4 раза« 123 »(1.231.231.231,00) и попробуйте удалить с помощью backspace (с конца) – avechuche

+0

Хорошо, может быть, описать это в этом вопросе. Звучит скорее как прецедент, а затем удаляет запятую –

ответ

0

Я думаю, что проблема это свойство:

UpdateSourceTrigger="PropertyChanged" 

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

Пусть ваш TextBox имеет текст 1,00, с видом-моделью, содержащей значение 1.0double. Затем вы удаляете запятую, поэтому текстовое поле имеет текст 100. Поскольку текст был изменен, это заставляет WPF обновлять модель представления из представления. Строка 100 становится double значением 100.0, которое установлено в вашем Weight вашего вида модели.

Если ваш класс модели представления реализует INotifyPropertyChanged (я предполагаю, что он это делает), он будет запускать событие для объекта Weight. WPF прослушивает это событие, а затем обновляет содержимое TextBox от свойства Weight. Как следствие, ваш TextBox затем содержит текст 100,00, так как это результат форматирования значения 100.0 с использованием строки формата N2.

Самым простым решением является удаление имущества UpdateSourceTrigger="PropertyChanged". Это приводит к тому, что WPF обновляет только модель представления, когда TextBox теряет фокус. Вы имеете дело с числовым вводом, и вполне возможно, что промежуточные значения недействительны или могут быть неверно истолкованы, поэтому лучше подождать, пока пользователь не завершит ввод числового значения, прежде чем пытаться что-либо с ним сделать.

2

Два наблюдения:

  1. StringFormat = N2, сообщает UI, что значение в текстовом поле должен быть отформатирован в виде числа с двух знаков после запятой.

  2. В преобразователеCultuer = es-AR сообщается пользовательскому интерфейсу, что символ десятичной запятой является запятой.

Итак, давайте этот шаг за шагом:

  1. Значение 1 (отображается как 1,00)
  2. Удалить запятую, но оставить нули
  3. значение теперь 100 (отображается как 100,00)

Я не вижу проблемы.

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