Я пытаюсь отобразить отформатированное десятичное число в 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 и ввести
.
Попытка 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 или создав присоединенное свойство и самостоятельно написав код форматирования. Он будет полон манипуляций со струнами и вызовет значительное выпадение волос.
Есть ли у кого-нибудь предложения по форматированию десятичных знаков, привязанных к текстовым полям, которые удовлетворяют всем вышеуказанным целям?