WPF - 单选按钮控件模板绑定“IsChecked”不起作用

时间:2015-08-03 06:51:50

标签: wpf xaml controltemplate ischecked

我有一个如下所示的控件模板,当用户选择单选按钮时,我想获得IsChecked属性。

但是当用户选择单选按钮“A”时,它的IsChecked属性仍然显示为false。为什么呢?

<ControlTemplate x:Key="RadioBtnTemplate" TargetType="{x:Type RadioButton}">
   <Grid>
     <StackPanel Margin="5">
         <RadioButton Name="tempbtn" IsChecked="{TemplateBinding IsChecked}" FontFamily="Segoe UI" FontSize="18.667" Content="{TemplateBinding Content}" GroupName="{TemplateBinding GroupName}"/>
      </StackPanel>
    </Grid>
</ControlTemplate>

我使用这个模板:

<RadioButton GroupName="CG" x:Name="_rdoBtnA" Content="A" Template="{DynamicResource RadioBtnTemplate}" IsChecked="True"/>
<RadioButton GroupName="CG" x:Name="_rdoBtnB" Content="B" Template="{DynamicResource RadioBtnTemplate}" />
<RadioButton GroupName="CG" x:Name="_rdoBtnC" Content="C" Template="{DynamicResource RadioBtnTemplate}" />

2 个答案:

答案 0 :(得分:4)

如果我们按原样采用你的例子,那么你有两个问题导致你所看到的问题。

问题1: 首先,您的设计创建了六个而不是三个 <RadioButton>控件。 <StackPanel>中的三个,然后是作为控件模板的一部分创建的三个。现在,所有六个单选按钮都链接为GroupName="CG"组的一部分。

如您所知,因为它们都属于同一个CG组,因此只有六个单选按钮中的一个可以将IsChecked属性设置为True。三个命名控件_rdoBtnA_rdoBtnB_rdoBtnC甚至在屏幕上都不可见,因此永远不能设置为True(在_rdoBtnA的情况下在模板控件绑定的那一刻,从False声明XAML迅速设置为True

要解决此问题,请从控制模板定义中删除GroupName="{TemplateBinding GroupName}",只留下组中的三个顶级单选按钮。

问题2:这个问题我认为是您问题的根源。 IsChecked={TemplateBinding IsChecked}只有OneWay绑定,不会以其他方式更新。要进行绑定TwoWay,您需要使用绑定定义的长版本IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"

现在通过进行这两项更改,控制模板就变成了这一点。

<ControlTemplate x:Key="RadioBtnTemplate" TargetType="{x:Type RadioButton}">
    <Grid>
        <StackPanel Margin="5">
            <RadioButton Name="tempbtn" IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" FontFamily="Segoe UI" FontSize="18.667" Content="{TemplateBinding Content}" />
        </StackPanel>
    </Grid>
</ControlTemplate>

答案 1 :(得分:0)

你可以这样使用它:

<StackPanel Orientation="Horizontal">
    <StackPanel.Resources>
        <ControlTemplate x:Key="ButtonAsSwatchTemplate">    
            <Border x:Name="SwatchBorder" BorderThickness="1">
                <Rectangle Fill="{TemplateBinding Property=Background}" Width="15" Height="15" />
            </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="ToggleButton.IsChecked" Value="True">
                <Setter TargetName="SwatchBorder" Property="BorderBrush" Value="Yellow" />
            </Trigger>
        </ControlTemplate.Triggers>
            </ControlTemplate>
        </StackPanel.Resources>
    <RadioButton Template="{StaticResource ButtonAsSwatchTemplate}"
        GroupName="CropGuidesColourRadioButtonGroup"
        IsChecked="{Binding Checked}" Margin="2" Background="Red" />
    <RadioButton Template="{StaticResource ButtonAsSwatchTemplate}"
        GroupName="CropGuidesColourRadioButtonGroup" 
        IsChecked="{Binding Checked}" Margin="2" Background="Black" />
</StackPanel>

取自StackOverFlow