如何通过验证 child 来更改 parent?

How to change a parent by validating a child?

我有一个 DockPanel,它由一个按钮和一个文本框组成。这些控件由边框包围。现在我想验证文本框并在验证失败时更改边框的颜色。

但是,在我当前的应用程序中,验证只影响文本框本身。

<Border>
    <DockPanel>
        <Button Command="{Binding GetFolder}">
            <Button.Template>
                <ControlTemplate>
                    <Image Source="/Assets/Icons/Folder.png"/>
                </ControlTemplate>
            </Button.Template>
        </Button>
        <TextBox 
            Text="{Binding 
            Path=DataFolder, 
            ValidatesOnDataErrors=True,
            Mode=TwoWay, 
            UpdateSourceTrigger=PropertyChanged, 
            NotifyOnSourceUpdated=True}">
        </TextBox>
    </DockPanel>
</Border>

我知道我可以给 Border 一个 ErrorTemplate:

<Border Validation.ErrorTemplate="{StaticResource errorTemplate}">...,

但是我如何告诉它文本框的验证结果?

您可以使用 StyleDataTrigger 绑定到 TextBox 的附加 Validation.HasError 属性:

<Border>
    <Border.Style>
        <Style TargetType="Border">
            <Style.Triggers>
                <DataTrigger Binding="{Binding (Validation.HasError),ElementName=tb}"
                             Value="True">
                    <Setter Property="BorderThickness" Value="1" />
                    <Setter Property="BorderBrush" Value="Red" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
    <DockPanel>
        <Button Command="{Binding GetFolder}">
            <Button.Template>
                <ControlTemplate>
                    <Image Source="/Assets/Icons/Folder.png"/>
                </ControlTemplate>
            </Button.Template>
        </Button>
        <TextBox x:Name="tb"
                    Text="{Binding 
                    Path=DataFolder, 
                    ValidatesOnDataErrors=True,
                    Mode=TwoWay, 
                    UpdateSourceTrigger=PropertyChanged, 
                    NotifyOnSourceUpdated=True}">
        </TextBox>
    </DockPanel>
</Border>