WPF-Fehlerstile werden nur auf der sichtbaren Registerkarte eines Registersteuerelements richtig gerendert

Ich habe ein Datenobjekt, das verwendet wird, um meine UI-Daten zu enthalten, die unterstützt werdenINotifyPropertyChanged undIDataErrorInfo. Ursprünglich hatte ich alle Steuerelemente der Benutzeroberfläche in einer großen WPF-Anwendung angezeigt und konnte mit Freude feststellen, dass Fehler über diesen benutzerdefinierten Stil gekennzeichnet wurden:

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

Ich habe das Programm heute neu organisiert und beschlossen, die verschiedenen Steuerelemente der Benutzeroberfläche auf mehrere Seiten eines Dokuments zu verteilenTabControl. Das Strukturlayout, das ich dafür verwende, ist:

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

(Ich benutze dieAdornerDecorator Wie ich in einem früheren Programm erlebt hatte, wird der Fehlerstil beim Wechseln von Registerkarten nicht neu gerendert. Ich kann mich nicht erinnern, wo ich das gesehen habe, aber es hat mir geholfen.)

Jetzt, wenn ich mein Programm starte, wird der Fehlerstil auf dem korrekt wiedergegebenTabItem das ist offen, wenn das Programm startet, aber nicht korrekt auf dem anderen gerendert wird (versteckt)TabItems. Wenn ich einen davon auswähle (und enthülle)TabItems Der Tooltip des Fehlerstils ist festgelegt, das Fehlersymbol wird jedoch nicht angezeigt.

Ich habe auch das Entfernen des benutzerdefinierten Stils und das Zurücksetzen auf den Standard-WPF-Fehlerstil für Textfelder getestet und erhalte weiterhin ein ähnliches Verhalten, d. H. Kein rotes Feld um das Steuerelement auf derTabItems, die beim Öffnen des Programms ausgeblendet werden.

Es scheint also, dass mir etwas völlig fehlt, das die Fehlerstile daran hindert, auf einem anderen als dem Element mit geöffneter Registerkarte korrekt zu rendern. Irgendwelche Ideen?

Bearbeiten 3. September Die Beschreibung wurde geändert, um ein besseres Verständnis für das zu ermöglichen, was ich gesehen habe

Sprechen Sie über Déjà vu im Jahr 2014

Es ist November 2014 und heute hatte ich dieses blöde WPF-Problem mit Fehlervorlagen, die nicht auf Elementen angezeigt wurden, die in einem Tab-Controller angezeigt wurden. Irgendetwas in meinem Hinterkopf deutet darauf hin, dass ich dieses Problem schon einmal gesehen habe. Also google ich und das erste, was auftaucht, ist meine eigene Frage aus dem Jahr 2009!

Dieses Mal sehe ich den Kommentar von dkl, der hinzugefügt wurde, nachdem ich die Dinge das letzte Mal gelöst hatte. Also habe ich es auf seine Weise versucht und diese Lösung verwendet (die gut funktioniert hat und ich musste kein Adorner-Steuerelement über meine Tab-Steuerelemente streuen):

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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage