错误模板显示在其他控件上方,应隐藏它

Adi*_*ter 16 .net validation wpf xaml idataerrorinfo

我正在尝试使用该IDataErrorInfo接口在我的WPF应用程序中实现验证,并且我遇到了一个不太理想的情况.

我有这个模板,当控件无法验证时使用

<ControlTemplate x:Key="errorTemplate">
    <DockPanel LastChildFill="true">
        <Border Background="Red" DockPanel.Dock="Right" Margin="5,0,0,0" Width="20" Height="20" CornerRadius="10"
                                    ToolTip="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
            <TextBlock Text="!" VerticalAlignment="Center" HorizontalAlignment="Center" FontWeight="Bold" Foreground="White" />
        </Border>
        <AdornedElementPlaceholder Name="customAdorner" VerticalAlignment="Center" >
            <Border BorderBrush="red" BorderThickness="1" />
        </AdornedElementPlaceholder>
    </DockPanel>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

一切顺利,直到我尝试在验证失败的控件上方显示某些内容,例如在其上方显示停靠项:

正常显示 隐藏部分控件时显示

如何避免这种情况并使我的错误模板显示在停靠项目下方,因为它应该如此?

编辑

我发现我可以TextBox用一个AdornerDecorator来修复它,但我真的不想为TextBox我的应用程序中的每个控件执行此操作.有没有办法用一种Style或其他方式设置它?

编辑2

我可能会更改默认的TextBoxControlTemplate以包含一个AdornerDecorator,但我不太热衷于更改任何WPF的默认控件模板.欢迎任何其他建议.

Adi*_*ter 14

好的,我找到了一个相对简单的解决方案,它不会强迫我更改任何控件模板.

而不是TextBoxAdornerDecorator这样的装饰每个

<StackPanel>
    <AdornerDecorator>
        <TextBox Text={Binding ...} />
    </AdornerDecorator>
    <AdornerDecorator>
        <TextBox Text={Binding ...} />
    </AdornerDecorator>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

我可以AdornerDecorator将整个视图包裹起来,从而获得相同的结果.

<AdornerDecorator>
    <StackPanel>
        <TextBox Text={Binding ...} />
        <TextBox Text={Binding ...} />
    </StackPanel>
</AdornerDecorator>
Run Code Online (Sandbox Code Playgroud)

这样我每次最多可以定义一次.