Я создаю пользовательский элемент управления текстового поля, чтобы иметь некоторые функции форматирования и проверки по умолчанию, включая настраиваемое свойство проверки, которое принимает действие или пользовательскую функцию.
В моей текущей ситуации я не могу использовать платформу проверки атрибутов, которую опубликовали некоторые люди, поскольку у меня нет достаточного доступа для изменения объектов модели данных. Я также не могу использовать ValidationRules, потому что не все текстовые поля, требующие этих проверок, будут связаны.
Я использовал общий стиль текстового поля в статическом конструкторе, а не определял свой собственный, но я добавил несколько триггеров данных, чтобы установить границу и всплывающую подсказку на основе моего собственного свойства зависимостей IsValid.
Кажется, все работает хорошо, но проблема в том, что, когда я нажимаю или нажимаю на текстовое поле, которое не прошло проверку, «недопустимый» стиль исчезает и переходит к стилю текстового поля по умолчанию.
Я попытался создать некоторые дополнительные датггеры для событий IsMouseOver, IsFocused и IsMouseCaptured (показанных ниже), но безрезультатно.
Я что-то упустил?
Статический конструктор (показывает, что я использую стиль TextBox:
static ValidatorTextBox()
{
//Commenting this line out to use the default textbox style
DefaultStyleKeyProperty.OverrideMetadata(typeof(ValidatorTextBox), new FrameworkPropertyMetadata(typeof(TextBox)));
}
А вот мой стиль:
<Style TargetType="{x:Type local:ValidatorTextBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsValid}" Value="False">
<Setter Property="BorderBrush" Value="Red" />
<Setter Property="BorderThickness" Value="1" />
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsRequired}" Value="True">
<Setter Property="Background" Value="AliceBlue" />
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsFocused}" Value="True">
<Setter Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource Self}, Path=BorderBrush}" />
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True">
<Setter Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource Self}, Path=BorderBrush}" />
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseCaptured}" Value="True">
<Setter Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource Self}, Path=BorderBrush}" />
</DataTrigger>
</Style.Triggers>
</Style>