WPF TextBox привязка к числовым или DateTime полям / свойствам
Я видел много ссылок на make TextBox, позволяющих вводить только цифры... нет проблем, я понимаю, как это сделать. Тем не менее, типичная привязка по-прежнему к "Text" (зависимость TextProperty) TextBox, который является строковым значением.
Если вводимое значение принуждается к числовому (скажем... целочисленное или двойное, с плавающей запятой для окончательного хранения), как бы вы имели правильную двустороннюю привязку, чтобы сказать
TextBox.MyInteger
TextBox.MyDouble
TextBox.MyFloat
TextBox.MyDateTime
Итак, если бы у меня был класс, который имел (например)
public class MyRecord
{
public int IntegerOnly { get; set; }
public double DoubleOnly { get; set; }
public DateTime SomeDate { get; set; }
}
И у меня есть TextBox в окне для ввода с применимыми поведениями / фильтрами, позволяющими ТОЛЬКО вводить числовые (и десятичные точки) значения в TextBox, отображение для пользователя осуществляется через показанное значение "Text".
Итак, я хочу, чтобы экземпляр "MyRecord.IntegerOnly" возвращал числовое значение назад (в базу данных) и вперед (в представление для просмотра / редактирования пользователем).
Поскольку все в C# приведено к типу, я не вижу никаких "подразумеваемых" или "преобразованных" значений из текста в числовые.
Аналогично, для ввода данных элемента управления TextBox типа DATE или DATETIME. Нет подразумеваемого / преобразованного значения...
Как я могу / должен продолжить это?
1 ответ
Я не знаю, не понимаю ли я ваш вопрос, но Binding
класс обрабатывает преобразования основных типов для вас. TextBox.Text
может только когда-либо показывать строковое / текстовое значение независимо от того, с чем оно связано (int, double, DateTime и т. д.). Binding
отвечает за преобразование значений туда и обратно между целью и источником, т. е. Int32 -> String
(для цели) и String -> Int32
(назад к источнику).
Вы можете очень легко обозначить TextBox
принимать только DateTime
значения, зная, что пользователь собирается ввести их как String
и Binding
преобразует его в ожидаемый DateTime
значение. Когда вам нужно преобразовать значения, которые не обрабатываются автоматически Binding
, вы должны предоставить свой собственный IValueConverter
,
Это отвечает на ваш вопрос, или я пропустил суть?