显示ErrorTemplate时,XAML GridRow不会自动缩放

时间:2016-11-04 20:23:56

标签: c# wpf xaml errortemplate

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

ErrorTemplate如下所示,正如您所看到的,我有一个AdornedElementPlaceholder,后跟一个文本框,其Text字段绑定到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中,高度=&#34; Auto&#34;。行根据文本框进行缩放,但是当ErrorTemplate出现时,底部有一个额外的TextBox - GridRow不会向上扩展以包含新的TextBox,而新的TextBox会重叠它下面的元素。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

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

这意味着如果您使用Validation.ErrorTemplate,则验证错误会显示在上方常用内容上,因此“第二个”TextBlock会显示在网格上,而不会显示在网格中细胞

我会实现INotifyDataErrorInfo而不是半过时的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>

答案 1 :(得分:0)

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

<Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>