Get Selected Radio Button in a Group (WPF)

26,577

One solution that comes to mind is to add an IsChecked boolean property to your Insertion entities and bind that to the `IsChecked' property of the Radio button. This way you can check the 'Checked' radio button in View Model.

Here is a quick and dirty example.

NB: I ignored the fact that the IsChecked can also be null, you could handle that using bool? if required.

The simple ViewModel

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace WpfRadioButtonListControlTest
{
  class MainViewModel
  {
    public ObservableCollection<Insertion> Insertions { get; set; }

    public MainViewModel()
    {
      Insertions = new ObservableCollection<Insertion>();
      Insertions.Add(new Insertion() { Text = "Item 1" });
      Insertions.Add(new Insertion() { Text = "Item 2", IsChecked=true });
      Insertions.Add(new Insertion() { Text = "Item 3" });
      Insertions.Add(new Insertion() { Text = "Item 4" });
    }
  }

  class Insertion
  {
    public string Text { get; set; }
    public bool IsChecked { get; set; }
  }
}

The XAML - The code behind is not shown since it has no code other than than the generated code.

<Window x:Class="WpfRadioButtonListControlTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfRadioButtonListControlTest"
        Title="MainWindow" Height="350" Width="525">
  <Window.Resources>
    <local:MainViewModel x:Key="ViewModel" />
  </Window.Resources>
  <Grid DataContext="{StaticResource ViewModel}">
    <ItemsControl ItemsSource="{Binding Insertions}">
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <Grid>
            <RadioButton GroupName="Insertions" 
                         Content="{Binding Text}" 
                         IsChecked="{Binding IsChecked, Mode=TwoWay}"/>
          </Grid>
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>
  </Grid>
</Window>
Share:
26,577
Kiang Teng
Author by

Kiang Teng

Updated on December 12, 2020

Comments

  • Kiang Teng
    Kiang Teng over 3 years

    I have a ItemsControl in my program that contains a list of radio buttons.

    <ItemsControl ItemsSource="{Binding Insertions}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <RadioButton GroupName="Insertions"/>
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    

    How do I find the selected radio button in the group Insertions in a MVVM manner?

    Most of the examples I have found on the internet involve setting individual boolean properties that you bind the IsChecked property to with the help of a converter.

    Is there an equivalent of the ListBox SelectedItem that I can bind to?