Стили ошибок WPF корректно отображаются только на видимой вкладке элемента управления вкладкой
У меня есть объект данных, используемый для хранения данных пользовательского интерфейса, который поддерживаетINotifyPropertyChanged
а такжеIDataErrorInfo
, Первоначально у меня были все элементы управления пользовательским интерфейсом, отображаемые в одном большом приложении WPF, и я с радостью видел ошибки, помеченные с помощью этого пользовательского стиля:
<!-- Set error style for textboxes -->
<Style x:Key="txtBoxErrStyle" TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel DockPanel.Dock="Right">
<AdornedElementPlaceholder />
<Image Source="Error.png"
Height="16"
Width="16"
ToolTip="{Binding Path=AdornedElement.ToolTip, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Adorner}}}" />
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Сегодня я реорганизовал программу и решил распределить различные элементы управления пользовательским интерфейсом на несколько страницTabControl
, Структура структуры, которую я использую для этого:
<tabcontrol>
<tabitem>
<AdornerDecorator>
[.. various Stack Panels, Groups and UI controls moved from original layout ..]
</AdornerDecorator>
</tabItem>
<tabitem>
<AdornerDecorator>
[.. various Stack Panels, Groups and UI controls moved from original layout ..]
</AdornerDecorator>
</tabItem>
...
</tabcontrol>
(Я используюAdornerDecorator
как я уже видел в предыдущей программе, стиль ошибок не перерисовывается при смене вкладок. Я не могу вспомнить, где я видел это, но это помогло мне.)
Теперь, когда я запускаю свою программу, стиль ошибок правильно отображается наTabItem
который открывается при запуске программы, но не правильно отображает другой (скрытый)TabItem
s. Когда я выбираю (и раскрываю) один из тех,TabItem
s подсказка стиля ошибки установлена, но изображение значка ошибки не отображается.
Я также протестировал удаление пользовательского стиля и вернулся к стандартному стилю ошибок WPF для текстовых полей, и я по-прежнему получаю аналогичное поведение, т. Е. Нет красной рамки вокруг элемента управления наTabItem
которые скрываются при открытии программы.
Так что кажется, что я полностью упускаю что-то, что мешает стилям ошибок корректно отображаться на чем-то кроме открытой вкладки Item. Есть идеи?
Редактировать 3 сентября Изменено описание, чтобы поддержать лучшее понимание того, что я видел
Поговорим о Дежавю в 2014 году
Это ноябрь 2014 года, и сегодня у меня была эта глупая проблема WPF с шаблонами ошибок, которые не отображаются на элементах, представленных в контроллере вкладок. Что-то в глубине души наводит на мысль, что я видел эту проблему раньше. Итак, я Google, и первое, что появляется, это мой собственный вопрос с 2009 года!
На этот раз я вижу комментарий от dkl, который был добавлен после того, как я решил все в последний раз. Поэтому я попробовал его по-своему и использовал это решение (которое работало хорошо, и мне не нужно было добавлять Adorner элемент управления для вкладок):
<Style x:Key="TextBoxErrorStyle" TargetType="TextBox">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Validation.HasError" Value="True" />
<Condition Property="IsVisible" Value="True" />
</MultiTrigger.Conditions>
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<TextBlock DockPanel.Dock="Right"
Foreground="Red"
FontSize="14pt"
Margin="-15,0,0,0" FontWeight="Bold">*
</TextBlock>
<Border BorderBrush="Red" BorderThickness="2">
<AdornedElementPlaceholder Name="controlWithError"/>
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}" />
</MultiTrigger>
</Style.Triggers>
</Style>