在 WPF 样式中如何更正将父复选框 属性 绑定到子项?

In WPF style how to correct bind parent checkbox property to a child?

我是 WPF 样式的新手,我无法使接下来的工作正常进行: 我有一个自定义复选框样式,其中包含另一个复选框。我需要父 "IsChecked" 值随 ControlTemplate 中的 "contolCheckBox" 子项更改而更改。 尝试了不同的触发器,但无法到达父级 属性。 现在我有下一个 xaml 代码:

<Style x:Key="CustomCheckBox" TargetType="{x:Type CheckBox}">
    <Setter Property="Height" Value="27" />
    <Setter Property="Foreground" Value="#FFBABAC7" />
    <Setter Property="HorizontalContentAlignment" Value="Left"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type CheckBox}">
                <Grid>
                    <CheckBox x:Name="contolCheckBox" HorizontalAlignment="Right" VerticalAlignment="Center"/>
                    <ContentPresenter  HorizontalAlignment="Left" VerticalAlignment="Center"/>
                </Grid>
            </ControlTemplate>

        </Setter.Value>
    </Setter>

    <Setter Property="IsChecked" Value="{Binding IsChecked, ElementName=contolCheckBox}"/>
    <!---->
    <Style.Triggers>
        <Trigger Property="IsChecked" Value="True">
            <Setter Property="Foreground" Value="#FF29E200"/>
        </Trigger>
        <Trigger Property="IsChecked" Value="False">
            <Setter Property="Foreground" Value="Firebrick"/>
        </Trigger>
    </Style.Triggers>
</Style>

"IsChecked" 控件的值不会改变。 我做错了什么?

Binding ElementName=contolCheckBox, Path=IsChecked

也不行。

我认为 controlCheckBox 不在名称范围内,因为它是在 ControlTemplate 中声明的。所以你的绑定不起作用。相反,反转你的绑定并从下往上绑定。在这样的情况下,您正在寻找的是模板绑定。在你的 ControlTemplate ..

中试试这个
<CheckBox x:Name="contolCheckBox" HorizontalAlignment="Right" VerticalAlignment="Center"
          IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsChecked, Mode=TwoWay}" />

注意RelativeSouce绑定。这表明我想绑定到模板的父级。这是将底层 ControlTemplate 控件绑定到父属性的常用方法。