wpf错误模板 - 在扩展器崩溃时仍然可以看到红色框

时间:2009-09-24 12:43:09

标签: wpf validation binding controltemplate

我正在对ExpBox中的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>

我想我的绑定出了问题,有人可以让我回到正轨吗?或者,是否有人知道在扩展器崩溃时仍然可以看到ErrorTemplate的另一个解决方案?

3 个答案:

答案 0 :(得分: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也会被隐藏,所以它上面的一切都会被隐藏。

答案 1 :(得分:1)

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

  1. 在转换器中粘贴断点(如果您使用的是断路器)
  2. 检查Visual Studio中的“输出”窗格,以获取有关无效绑定的任何调试警告
  3. 在您发布的代码中,我相信这将是因为Setter上的Value属性不是依赖属性,因此无法绑定。

    我会考虑一下这个问题,看看能不能提出更有帮助的东西。

答案 2 :(得分:1)