11

我正在对 Expander 中的 TextBox 的 DataSource 进行一些验证,并发现一旦触发了验证错误,如果我折叠 Expander,红色框就会停留在 TextBox 本来的位置。

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

我试图通过将错误模板的可见性绑定到扩展器来解决这个问题,但是我认为绑定有问题。

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

我想我的装订出了问题,有人可以让我回到正轨吗?或者,是否有人知道在 Expander 折叠时仍然可以看到 ErrorTemplate 的另一种解决方案?

4

3 回答 3

25

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也会被隐藏,上面的所有东西也应该被隐藏。

于 2009-09-24T13:37:51.820 回答
1

通常,调试绑定可以通过以下方式完成:

  1. 在转换器中粘贴断点(如果你正在使用一个,你就是)
  2. 检查 Visual Studio 中的“输出”窗格以获取有关无效绑定的任何调试警告

在您发布的代码中,我相信这将是因为 Setter 上的 Value 属性不是依赖属性,因此无法绑定。

我会考虑一下,看看我能不能想出一些更有帮助的东西。

于 2009-09-24T13:40:04.780 回答
1

查看 Donnelle在我的 wpf 绑定验证失败并且包含面板不再可见时如何摆脱红色矩形的答案?. 它与扩展器一起为我工作。

于 2009-10-08T14:26:57.850 回答