WPF/C# - example for programmatically create & use Radio Buttons
Normally, we use RadioButtons to present an Enum data type to the user. And what we usually do is use an ItemsControl to present a group of RadioButtons, with each one bound to a ViewModel.
Below is a sample application I just wrote that demonstrates how RadioButtons could be used in two ways: the first is somewhat of a direct approach (and this may answer your questions above), and the second one uses an MVVM approach.
BTW, this is just something I wrote quickly (yeah, I got a lot of time in my hands) so I won't say that everything in here is the perfect way of doing things. But I hope you find this helpful:
XAML:
<Window x:Class="RadioButtonSample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:RadioButtonSample" Title="MainWindow" Height="350" Width="525"> <StackPanel> <StackPanel x:Name="sp"/> <Button x:Name="showChoice" Click="showChoice_Click">Show Choice</Button> <StackPanel x:Name="sp2"> <StackPanel.DataContext> <local:ViewModel/> </StackPanel.DataContext> <ItemsControl x:Name="itemsControl" ItemsSource="{Binding Path=Choices}"> <ItemsControl.ItemTemplate> <DataTemplate> <RadioButton IsChecked="{Binding Path=IsChecked}" Content="{Binding Path=Choice}" GroupName="ChoicesGroup"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> <Button x:Name="showChoice2" Click="showChoice2_Click">Show Choice2</Button> </StackPanel></StackPanel>
Code-behind:
using System;using System.Collections;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;using System.ComponentModel;using System.Collections.Generic;namespace RadioButtonSample{ /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); //Initialize the first group of radio buttons and add them to the panel. foreach (object obj in Enum.GetValues(typeof(ChoicesEnum))) { RadioButton rb = new RadioButton() { Content = obj, }; sp.Children.Add(rb); rb.Checked += new RoutedEventHandler(rb_Checked); rb.Unchecked += new RoutedEventHandler(rb_Unchecked); } } void rb_Unchecked(object sender, RoutedEventArgs e) { Console.Write((sender as RadioButton).Content.ToString() + " checked."); } void rb_Checked(object sender, RoutedEventArgs e) { Console.Write((sender as RadioButton).Content.ToString() + " unchecked."); } private void showChoice_Click(object sender, RoutedEventArgs e) { foreach (RadioButton rb in sp.Children) { if (rb.IsChecked == true) { MessageBox.Show(rb.Content.ToString()); break; } } } private void showChoice2_Click(object sender, RoutedEventArgs e) { //Show selected choice in the ViewModel. ChoiceVM selected = (sp2.DataContext as ViewModel).SelectedChoiceVM; if (selected != null) MessageBox.Show(selected.Choice.ToString()); } } //Test Enum public enum ChoicesEnum { Choice1, Choice2, Choice3, } //ViewModel for a single Choice public class ChoiceVM : INotifyPropertyChanged { public ChoicesEnum Choice { get; private set; } public ChoiceVM(ChoicesEnum choice) { this.Choice = choice; } private bool isChecked; public bool IsChecked { get { return this.isChecked; } set { this.isChecked = value; this.OnPropertyChanged("IsChecked"); } } #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propName) { if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(propName)); } } #endregion } //Sample ViewModel containing a list of choices //and exposes a property showing the currently selected choice public class ViewModel : INotifyPropertyChanged { public List<ChoiceVM> Choices { get; private set; } public ViewModel() { this.Choices = new List<ChoiceVM>(); //wrap each choice in a ChoiceVM and add it to the list. foreach (var choice in Enum.GetValues(typeof(ChoicesEnum))) this.Choices.Add(new ChoiceVM((ChoicesEnum)choice)); } public ChoiceVM SelectedChoiceVM { get { ChoiceVM selectedChoice = this.Choices.FirstOrDefault((c) => c.IsChecked == true); return selectedChoice; } } #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propName) { if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(propName)); } } #endregion }}