Стили ошибок 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 который открывается при запуске программы, но не правильно отображает другой (скрытый)TabItems. Когда я выбираю (и раскрываю) один из тех,TabItems подсказка стиля ошибки установлена, но изображение значка ошибки не отображается.

Я также протестировал удаление пользовательского стиля и вернулся к стандартному стилю ошибок 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>

Ответы на вопрос(3)

Ваш ответ на вопрос