Как я могу отформатировать десятичное число, связанное с TextBox, не рассердив своих пользователей?

Я пытаюсь отобразить отформатированное десятичное число в TextBox, используя привязку данных в WPF.

Голы

Цель 1 :При установке десятичного свойства в коде отображать 2 десятичных разряда в текстовом поле.

Цель 2 :Когда пользователь взаимодействует с (типами в )текстовом поле, не злите его/ее.

Цель 3 :Привязки должны обновить источник на PropertyChanged.

Попытки

Попытка 1 :Без форматирования.

Здесь мы начинаем почти с нуля.


Нарушает цель 1. SomeDecimal = 4.5отобразит «4,50000» в текстовом поле.

Попытка 2 :Используйте StringFormat в привязке.


Нарушает цель 2. Допустим, SomeDecimal равен 2,5, а в текстовом поле отображается «2,50». Если мы выберем все и введем «13.5», мы получим «13.5.00» в текстовом поле, потому что средство форматирования «услужливо» вставляет десятичные знаки и нули.

Попытка 3 :использует MaskedTextBox из расширенного набора инструментов WPF.

http://wpftoolkit.codeplex.com/wikipage?title=MaskedTextBox

Предполагая, что я правильно читаю документацию, маска ##0.00 означает «две необязательные цифры, за которыми следует обязательная цифра, десятичная точка и еще две обязательные цифры. в это TextBox равно 999,99", но скажем так, меня это устраивает.


Нарушает цель 2. Текстовое поле начинается с ___.__, и его выбор и ввод 5.75 дает 575.__. Единственный способ получить 5.75 — выбрать TextBox и ввести 5.75.

Попытка 4 :использует счетчик DecimalUpDown из Extended WPF Toolkit.

http://wpftoolkit.codeplex.com/wikipage?title=DecimalUpDown


Нарушает цель 3. DecimalUpDown радостно игнорирует UpdateSourceTrigger=PropertyChanged. Один из координаторов на странице Codeplex расширенного инструментария WPF предлагает модифицированный ControlTemplate по адресуhttp://wpftoolkit.codeplex.com/discussions/352551/. Это удовлетворяет цели 3, но нарушает цель 2, демонстрируя то же поведение, что и в попытке 2.

Попытка 5 :Используя триггеры данных стиля, используйте форматирование только в том случае, если пользователь не редактирует.

Привязка к двойнику с помощью StringFormat в TextBox

Даже если бы этот подход удовлетворял всем трем целям, я бы не хотел его использовать. (A )Текстовые поля стали состоять из 12 строк вместо 1, и мое приложение содержит очень много текстовых полей. (B )Все мои текстовые поля уже имеют атрибут Style, который указывает на глобальный StaticResource, который устанавливает Margin, Height и другие параметры. (C )Вы могли заметить, что в приведенном ниже коде путь привязки устанавливается дважды, что нарушает принцип DRY.


    
        
    

Все эти неудобные вещи в сторону...

Нарушает цель 2. Во-первых, щелчок на текстовом поле, которое отображает «13,50», внезапно приводит к отображению «13,5000», что неожиданно. Во-вторых, если начать с пустого текстового поля и ввести «13.50», текстовое поле будет содержать «1350». Я не могу объяснить почему, но нажатие клавиши точки не вставляет десятичные знаки, если курсор находится в правом конце строки в текстовом поле.Если TextBox содержит строку длиной > 0, и я перемещаю курсор в любое место, кроме правого конца строки, я могу вставить десятичные точки.

Попытка 6 :Сделай сам.

Я собираюсь отправиться в путь боли и страданий, создав подкласс TextBox или создав присоединенное свойство и самостоятельно написав код форматирования. Он будет полон манипуляций со струнами и вызовет значительное выпадение волос.


Есть ли у кого-нибудь предложения по форматированию десятичных знаков, привязанных к текстовым полям, которые удовлетворяют всем вышеуказанным целям?

52
задан Community 23 May 2017 в 02:10
поделиться