Как я могу запустить 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>
Другие вопросы по тегам