0

我有一个带有 TextBox 的 XAML 窗口,而这个 TextBox 有一个 ErrorTemplate。

ErrorTemplate 如下所示,如您所见,我有一个 AdornedElementPlaceholder,后跟一个文本框,其文本字段绑定到 ErrorContent:

<ControlTemplate x:Key="ValidationErrorTemplateTextBlock" TargetType="{x:Type Control}">
    <Border BorderBrush="Red" BorderThickness="1">
        <StackPanel Orientation="Vertical">
            <AdornedElementPlaceholder Name="AdornedElementPlaceholder" />
            <TextBlock Text="{Binding ElementName=AdornedElementPlaceholder, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" 
                    FontSize="10"
                    Background="Red"
                    Foreground="White"
                    Padding="2" />
        </StackPanel>
    </Border>
</ControlTemplate>

<TextBox IsEnabled="{Binding SendMessage}"
                    Text="{Binding AutoMessageSubject, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"
                    Style="{StaticResource StyleBase}"
                    Validation.ErrorTemplate="{StaticResource ValidationErrorTemplateTextBlock}"
                    HorizontalAlignment="Stretch"
                    Grid.Row="3"
                    Grid.Column="1"
                    Grid.ColumnSpan="2" />

这很好用,除了一件事:TextBox 在 GridRow 内,Height="Auto"。该行根据文本框自行缩放,但是当出现 ErrorTemplate 时,底部有一个额外的 TextBox - GridRow 不会按比例放大以包含新的 TextBox,并且新的 TextBox 与其下方的元素重叠。

我该如何解决这个问题?

4

2 回答 2

1

Validation.ErrorTemplate :获取或设置用于在装饰层上生成验证错误反馈的 ControlTemplate 。

这意味着如果您使用,验证错误将显示在通常内容之上Validation.ErrorTemplate的图层上,因此“第二个”TextBlock 显示在网格上,而不是网格单元格内。

我将实现INotifyDataErrorInfo而不是 semi-obsolete IDataErrorInfo,使用自定义文本框样式,并将第二个 TextBlock 的可见性绑定到HasErrors属性。下面的示例使用 ToolTip 而不是第二个 TextBlock:

       <Style TargetType="{x:Type TextBox}">
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="True">
                    <Setter Property="ToolTip">
                        <Setter.Value>
                            <ToolTip DataContext="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget}">
                                <ItemsControl DisplayMemberPath="ErrorContent" ItemsSource="{Binding Path=(Validation.Errors)}" />
                            </ToolTip>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
于 2016-11-04T22:34:43.973 回答
0

您可能想尝试添加行/列定义:

<Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
于 2016-11-04T20:56:03.230 回答