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>
...


RadioButtonTest - Not Working.zip


