I am developing a windows phone application and came across a situation where I needed mulitple radio button list box binding different values of same type. When I went for a control template as below, everything went just fine except that I ended up having the group name which means that doesn’t matter I have 5 list box with radio buttons, I can select only one button.
<Style x:Key="RadioListItem" TargetType="ListBoxItem"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListBoxItem"> <RadioButton x:Name="RadioButtonControl" IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsSelected, Mode=TwoWay}" DataContext="{TemplateBinding IsSelected}" Content="{TemplateBinding Content}" /> </ControlTemplate> </Setter.Value> </Setter> </Style>
I implemented the template to the listbox as below.
<ListBox x:Name="SizeFilter" SelectedItem="{Binding Size, Mode=TwoWay}" ItemContainerStyle="{StaticResource RadioListItem}" />
So after getting cornored by different problem like that I will not be able to use AncestorType or use a data template, I was stuck up here for a long time. I could have done a workaround by writing a piece of code on the code behind to set the group name and resolved. But, when it comes to Silverlight / WPF, I would love to solve everything right in the XAML itself.
Well as in my olden times of VB6, I thought what is “Tag” for; if it can’t help me here. So I changed my solution to pass GroupName as a tag from my ListBox to the template. And below is how I accompolised.
<Style x:Key="RadioListItem" TargetType="ListBoxItem"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListBoxItem"> <RadioButton x:Name="RadioButtonControl" IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsSelected, Mode=TwoWay}" DataContext="{TemplateBinding IsSelected}" Content="{TemplateBinding Content}" GroupName="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}" /> </ControlTemplate> </Setter.Value> </Setter> </Style>
And here goes my ListBox.
<ListBox x:Name="SizeFilter" SelectedItem="{Binding Size, Mode=TwoWay}" > <ListBox.ItemContainerStyle> <Style BasedOn="{StaticResource RadioListItem}" TargetType="ListBoxItem" > <Setter Property="Tag" Value="SizeFilterGroup" /> </Style> </ListBox.ItemContainerStyle> </ListBox>
As I mentioned I am using the Tag property of the ItemContainer to pass the “GroupName” to the control template. So now all is fine and I can use the same template for multiple list box with different groups. And now I can select 5 radio buttons according to their list.
One thought on “Radio Button List Box With Seperate Group Name in Silverlight”