Чтобы усилить моё предложение об использовании рекламного элемента.
Рекламный элемент - это элемент, отображаемый на собственном слое, который появляется поверх или вокруг другого элемента.Например, если вы реализуете валидацию в привязке, красное поле, которое украшает недопустимый элемент управления, является украшением - оно не является частью элемента управления и может (и применяется) ко всем видам элементов управления.См. раздел Adorners документации WPF для простого, но ясного примера.
Я подумал об Adorner по нескольким причинам.Основным является то, что описываемое вами поведение не обязательно должно быть ограничено TextBox
.Например, вы можете захотеть, чтобы ComboBox
демонстрировал такое же поведение.Внедрение Adorner даст вам согласованный способ реализации этой функциональности в нескольких элементах управления (хотя это не имеет смысла, например, в CheckBox
или ProgressBar
).Во-вторых, вам не нужно ничего делать с базовым элементом управления более тщательно, чем реализовывать триггеры для отображения и скрытия Adorner в ответ на события фокуса.Украсить это немного сложно, но стоит знать, как это сделать.
Все это говорит, что мне нравится ответ mattjf гораздо больше, чем мой.Единственные недостатки, которые я вижу при таком подходе: 1) Он работает только с TextBox
;вам нужно внедрять новую версию стиля каждый раз, когда вы хотите использовать подход на другом элементе управления, 2) Возможно, я просто участвую в магическом мышлении, но каждый раз, когда я использовал свойство Tag
в WinForms, оно сообщало мнеоднажды я научился слушать) что я строил что-то хрупкое.Я не знаю наверняка, что это также верно и для WPF, но держу пари, что так оно и есть.
Мой комментарий по использованию свойства bound Text
, вероятно, нуждается в усилении.Если вы используете свойство Text для хранения метки поля, то у вас есть ряд трудно решаемых проблем.Во-первых, поскольку это связанное свойство, изменение его значения в TextBox
изменит его в источнике.Итак, теперь вашему источнику нужно знать много информации о состоянии пользовательского интерфейса - в данный момент фокус находится на элементе управления?Если значение свойства Text
равно Foo
, означает ли это, что метка имеет значение Foo
или пользователь ввел Foo
?Вероятно, есть способы, которыми вы можете управлять этим, но лучший способ управлять этим - не делать этого.
(Еще одна проблема с этой парадигмой: каким должно быть поведение, если пользователь хочет значение TextBox
, которое будет пустой строкой?)