Как я могу запустить ValidationRule в сетке WPF на основе ее содержимого, а не свойств, таких как ширина?
Можно использовать только ValidationRule
с переплетом; какой хороший способ использоватьValidation.ErrorTemplate
с участием Grid
на основе его содержимого, а не его свойств, таких как ширина и т. д.?
1 ответ
Использовать Tag
свойство.
У меня была группа переключателей внутри моей сетки, и я хотел убедиться, что в ней есть хотя бы один отмеченный элемент. В противном случае я хотел бы выделить всю сетку значкомValidation.ErrorTemplate
чтобы предупредить пользователя о том, что он не завершил заполненный раздел формы.
Итак, я сделал это в XAML:
<Grid
Name="GridReportType"
Margin="0,20,0,0">
<Grid.Tag>
<Binding Path="ReportTypeSelected"
UpdateSourceTrigger="PropertyChanged"
Mode="OneWayToSource">
<!--Validation rules only fire when target (WPF property) updates source (class property)-->
<Binding.ValidationRules>
<parent:FailIfFalse/>
</Binding.ValidationRules>
</Binding>
</Grid.Tag>
</Grid
с этим в коде окна за конструктором:
this.GridReportType.Tag = false;
и с этим ValidationRule:
public class FailIfFalse : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (!((bool)value))
{
return new ValidationResult(false, "Required");
}
else
{
return new ValidationResult(true, null);
}
}
}
и с этим шаблоном ошибки:
<Grid.Style>
<Style>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel>
<TextBlock DockPanel.Dock="Bottom"
Foreground="Red"
FontSize="24"
FontStyle="Italic"
HorizontalAlignment="Center"
Text="{Binding ElementName=cantBeEmptyAdorner,
Path=AdornedElement.(Validation.Errors),
Converter={StaticResource GetLatestValidationError}}"/>
<Border BorderBrush="Red"
BorderThickness="1"
Margin="-1">
<AdornedElementPlaceholder x:Name="cantBeEmptyAdorner"/>
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
</Grid.Style>