Style błędów WPF są renderowane prawidłowo tylko na widocznej zakładce kontrolki tabulacji

Mam obiekt danych używany do przechowywania moich danych interfejsu użytkownika, który obsługujeINotifyPropertyChanged iIDataErrorInfo. Pierwotnie wszystkie kontrolki interfejsu użytkownika były wyświetlane w jednej dużej aplikacji WPF i szczęśliwie widziałem błędy oznaczone tym stylem:

    <!-- 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>

Reorganizowałem program dzisiaj i postanowiłem rozpowszechniać różne kontrolki interfejsu użytkownika na kilku stronachTabControl. Układ struktury, którego używam to:

<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>

(UżywamAdornerDecorator jak w poprzednim programie doświadczyłem, że styl błędu nie jest ponownie renderowany podczas zamiany stron kart. Nie pamiętam, gdzie to widziałem, ale to mi pomogło.)

Teraz, kiedy rozpoczynam program, styl błędu poprawnie wyświetla się naTabItem który jest otwarty, gdy program się uruchamia, ale nie renderuje poprawnie na drugim (ukryty)TabItems. Kiedy wybieram (i ujawniam) jedną z nichTabItems jest ustawiona końcówka stylu błędu, ale obraz ikony błędu nie jest wyświetlany.

Przetestowałem również usunięcie niestandardowego stylu i przywrócić domyślny styl błędu WPF dla pól tekstowych i nadal zachowuję się w podobny sposób, tj. Brak czerwonego pola wokół kontrolki naTabItems, które są ukryte po otwarciu programu.

Wygląda więc na to, że całkowicie brakuje mi czegoś, co powstrzymuje style błędów przed prawidłowym renderowaniem na innej niż otwarta zakładka Element. Jakieś pomysły?

Edytuj 3 września Zmieniono opis, aby lepiej zrozumieć to, co widziałem

Porozmawiaj o Déjà vu w 2014 roku

Jest listopad 2014 r. I dziś miałem ten głupi problem WPF z szablonami błędów nie pojawiającymi się na elementach przedstawionych w kontrolerze kart. Coś z tyłu mojego umysłu sugeruje, że widziałem już ten problem. Więc google, a pierwszą rzeczą, która się pojawia, jest moje własne pytanie z 2009 roku!

Tym razem widzę komentarz z dkl, który został dodany po rozwiązaniu rzeczy po raz ostatni. Więc wypróbowałem to na swój sposób i użyłem tego rozwiązania (które działało dobrze i nie musiałem dodawać kontroli Adornera do moich kontrolek kart):

<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>

questionAnswers(3)

yourAnswerToTheQuestion