我正在对Expander中的TextBox的数据源进行一些验证,发现一旦触发验证错误,如果我折叠Expander,则红色框会保留在TextBox所在的位置。

<Expander Header="Blah Blah Blah">
  <TextBox Name="TextBox"
           Validation.ErrorTemplate="{DynamicResource TextBoxErrorTemplate}"
           Text="{Binding Path=Blah,
                          UpdateSourceTrigger=PropertyChanged,
                          ValidatesOnDataErrors=True}" />
</Expander>

我试图通过将错误模板的可见性绑定(bind)到Expander来解决这个问题,但是我认为绑定(bind)有问题。
<local:NotVisibleConverter x:Key="NotVisibleConverter" />

<ControlTemplate x:Key="TextBoxErrorTemplate">
  <DockPanel>
    <Border BorderBrush="Red" BorderThickness="2"
            Visibility="{Binding Path=IsExpanded,
                                 Converter={StaticResource NotVisibleConverter},
                                 RelativeSource={RelativeSource AncestorType=Expander}}" >
      <AdornedElementPlaceholder Name="MyAdorner" />
    </Border>
  </DockPanel>
  <ControlTemplate.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self},
                                Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </ControlTemplate.Triggers>
</ControlTemplate>

我想我的装订出问题了,有人可以让我回到正轨吗?另外,有人知道在扩展器崩溃时仍然可以看到ErrorTemplate的另一种解决方案吗?

最佳答案

无需进行任何绑定(bind),您可以在扩展器内部的元素周围放置一个AdornerDecorator。您会看到,验证错误模板放置在装饰层上,这样它就可以显示在其他所有内容之上。最终,这就是您的问题所在。即使由于关闭了扩展器而看不到您的文本框,但错误模板仍位于装饰层上。

我相信您可以使用以下xaml解决此问题:

<Expander Header="Blah Blah Blah">
   <AdornerDecorator>
      <TextBox Name="TextBox"
               Validation.ErrorTemplate="{DynamicResource TextBoxErrorTemplate}"
               Text="{Binding Path=Blah,
                              UpdateSourceTrigger=PropertyChanged,
                              ValidatesOnDataErrors=True}" />
   </AdornerDecorator>
</Expander>

这将创建一个专门用于扩展器的装饰层。当扩展器关闭时,AdornerDecorator也被隐藏,因此上面的所有内容也应被隐藏。

关于wpf错误模板-扩展器崩溃时仍可见红色框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1471451/

10-09 22:58