XAML GridRow не масштабируется автоматически при отображении ErrorTemplate
У меня есть окно XAML с TextBox, и этот TextBox имеет ErrorTemplate.
Шаблон ErrorTemplate показан ниже, и, как вы можете видеть, у меня есть держатель AdornedElementPlace, за которым следует текстовое поле, текстовое поле которого связано с 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 перекрывает элементы под ним.
Как я могу решить это?
2 ответа
Validation.ErrorTemplate: получает или задает ControlTemplate, используемый для генерации обратной связи об ошибке проверки на уровне adorner.
Это означает, что если вы используете Validation.ErrorTemplate
ошибки проверки отображаются на слое над обычным содержимым, поэтому "второй" текстовый блок отображается над сеткой, а не внутри ячейки сетки.
Я бы реализовал INotifyDataErrorInfo
вместо полу устаревшего IDataErrorInfo
используйте пользовательский стиль текстового поля и привяжите видимость второго TextBlock к HasErrors
имущество. Пример ниже использует всплывающую подсказку вместо второго 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>
Вы можете попробовать добавить определения строк / столбцов:
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>