WPF数据绑定和验证

时间:2019-08-26 07:46:31

标签: wpf validation data-binding

我有一个WPF用户界面,并且已经用UpdateSourceTrigger =“ Explicit”实现了绑定的ValidationRules。我发现当标签页可见正在验证的字段时,它可以完美地工作: enter image description here

但是如果我在表单结束的第三个选项卡页面上,并在BindingExpressions上触发Validated字段的UpdateSources方法,那么当我退回到第一个选项卡时,这些字段实际上并没有以红色突出显示。即使我回到该标签页并重新触发,即使它们为空,它们也不会突出显示。我需要输入一个值,然后重新触发,然后删除该值并重新触发,然后将修改后的值突出显示。

有人知道如何解决此行为吗? 还有一种方法可以在验证失败时强制将特定的选项卡页面切换到第一个字段失败的页面?

我知道PropertyChanged和LostFocus可以选择,但我想先获得完整的表单条目,最后一击即可完成所有验证。

1 个答案:

答案 0 :(得分:0)

这是因为TabControl处理AdornerLayer的方式。当切换TabItem时,显然不会保留它们。当您强制切换回AdornerLayer时重新渲染TabItem时,此方法将起作用。

<!-- Custom error template -->
<ControlTemplate x:Key="ValidationErrorTemplate">
  <StackPanel>

    <!-- Placeholder for the TextBox itself -->
    <AdornedElementPlaceholder />

    <TextBlock Text="{Binding ErrorContent}"
               Foreground="Red" />
  </StackPanel>
</ControlTemplate>

<!-- Style to trigger the rendering of the AdornerLayer by setting the error template -->
<Style TargetType="TextBox">
  <Setter Property="Validation.ErrorTemplate"
          Value="{x:Null}" />
  <Style.Triggers>
    <MultiTrigger>
      <MultiTrigger.Conditions>
        <Condition Property="Validation.HasError"
                   Value="True" />
        <Condition Property="IsVisible"
                   Value="True" />
      </MultiTrigger.Conditions>
      <Setter Property="Validation.ErrorTemplate"
              Value="{StaticResource ValidationErrorTemplate}" />
    </MultiTrigger>
  </Style.Triggers>
</Style>

考虑避免当前标签出现验证错误,请避免离开此标签。