Это была очень неприятная проблема для меня.
В классе WPF RadioButton есть ошибка, которая удаляет привязку для свойства IsChecked при назначении нескольких RadioButton для одного и того же GroupName. Люди много обходились, но когда мне снова пришлось это посетить, я нашел такой, который не вызывает у меня тошноты.
Итак, вы должны создать подкласс класса RadioButton следующим образом:
public class RadioButton: System.Windows.Controls.RadioButton
{
protected override void OnClick()
{
base.OnClick();
SetValue(CurrentValueProperty,CheckedValue);
}
public int CurrentValue
{
get { return (int)GetValue(CurrentValueProperty); }
set { SetValue(CurrentValueProperty, value); }
}
// Using a DependencyProperty as the backing store for CurrentValue. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CurrentValueProperty =
DependencyProperty.Register("CurrentValue", typeof(int), typeof(RadioButton), new FrameworkPropertyMetadata(0,FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, CurrentValue_Changed));
public static void CurrentValue_Changed(object sender, DependencyPropertyChangedEventArgs e)
{
((RadioButton)sender).IsChecked = ((RadioButton)sender).CurrentValue == ((RadioButton)sender).CheckedValue;
}
public int CheckedValue
{
get { return (int)GetValue(CheckedValueProperty); }
set { SetValue(CheckedValueProperty, value); }
}
// Using a DependencyProperty as the backing store for CheckedValue. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CheckedValueProperty =
DependencyProperty.Register("CheckedValue", typeof(int), typeof(RadioButton), new UIPropertyMetadata(0));
}
Все, что это делает, это добавляет два свойства зависимостей, чтобы вы могли сделать сравнение на равенство.
Итак, в XAML пример будет таким:
<UserControl x:Class="MyClass"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:MVVMLibrary;assembly=MVVMLibrary"
Height="Auto" Width="Auto">
<c:RadioButton CurrentValue="{Binding MyValue}" CheckedValue="1" GroupName="SearchType" >Value 1</c:RadioButton>
<c:RadioButton Grid.Column="1" CurrentValue="{Binding MyValue}" CheckedValue="2" GroupName="SearchType" >Value 2</c:RadioButton>
</UserControl>
Итак, если вы заметили, все, что вы делаете, это
1) Привязать к свойству CurrentValue
2) Установите для свойства CheckedValue значение, которое сделало бы проверку RadioButton
3) Установите RadioButtons на то же имя группы
Если вы заметили, что я сделал intValue и CheckedValue типа int. Причина, по которой я это сделал, заключается в том, что вы можете связать CurrentValue с перечислением. Я думаю, что это круто, но это только мое мнение, которое, вероятно, не имеет большого значения. :)
Надеюсь, это кому-нибудь поможет.