If you try to use RadioButtons as usual in MVVM, it will not work as you expect.
For example, here is a very simple UI using two RadioButtons.
A very simple UI using two RadioButtons.
My first attempt is to use this View:
... <GroupBox Header="I love"> <StackPanel> <RadioButton IsChecked="{Binding IsPeaceLover}">Peace</RadioButton> <RadioButton>Earth</RadioButton> </StackPanel> </GroupBox> ...
and this ViewModel:
class UserViewModel : ViewModelBase { bool isPeaceLover = true; public bool IsPeaceLover { get { return this.isPeaceLover; } set { if (this.isPeaceLover == value) return; this.isPeaceLover = value; OnPropertyChanged("IsPeaceLover"); } } ... }
But as you may know, it doesn't work. There are many solutions to avoid this problem.
Anyway, I've created a new pattern that is more appropriate to MVVM (not using Code-Behind).
Try this View:
... <GroupBox Header="I love"> <StackPanel> <RadioButton IsChecked="{Binding IsPeaceLover}">Peace</RadioButton> <RadioButton IsChecked="{Binding IsEarthLover}">Earth</RadioButton> </StackPanel> </GroupBox> ...
and this ViewModel:
class UserViewModel : ViewModelBase { bool isPeaceLover = true; public bool IsPeaceLover { get { return this.isPeaceLover; } set { if (this.isPeaceLover == value) return; this.isPeaceLover = value; OnPropertyChanged("IsPeaceLover", "IsEarthLover"); } } public bool IsEarthLover { get { return !IsPeaceLover; } set { IsPeaceLover = !value; } } ... }
If you have more options user can choose, you can extend the pattern like this:
public enum Priority { Low, Middle, High, } class JobViewModel : ViewModelBase { Priority priority = Priority.Low; public Priority Priority { get { return this.priority; } set { if (this.priority == value) return; this.priority = value; OnPropertyChanged("Priority" , "IsLowPriority", "IsMiddlePriority", "IsHighPriority"); } } public bool IsLowPriority { get { return Priority == Priority.Low; } set { Priority = value ? Priority.Low : Priority; } } public bool IsMiddlePriority { get { return Priority == Priority.Middle; } set { Priority = value ? Priority.Middle : Priority; } } public bool IsHighPriority { get { return Priority == Priority.High; } set { Priority = value ? Priority.High : Priority; } } }
... <GroupBox Header="Priority"> <StackPanel> <RadioButton IsChecked="{Binding IsLowPriority}">Low</RadioButton> <RadioButton IsChecked="{Binding IsMiddlePriority}">Middle</RadioButton> <RadioButton IsChecked="{Binding IsHighPriority}">High</RadioButton> </StackPanel> </GroupBox> ...