我有一个如下所示的控件模板,当用户选择单选按钮时,我想获得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}" />
答案 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>