在 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
控件绑定到父属性的常用方法。
我是 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
控件绑定到父属性的常用方法。