Если вы хотите использовать RadioButton, вам просто нужно сделать несколько небольших настроек, чтобы обойти стандартное поведение RadioButton.
Первая проблема, которую необходимо обойти, - автоматическая группировка кнопок RadioButton на основе их общего непосредственного родительского контейнера.Поскольку вам не нравится взлом "GroupName", другой вариант - поместить каждую кнопку RadioButton в свою собственную таблицу или другой контейнер.Это сделает каждую кнопку членом ее собственной группы и заставит их вести себя в зависимости от привязки IsChecked.
<StackPanel Orientation="Horizontal">
<Grid>
<RadioButton IsChecked="{Binding Path=CurrentMode, Converter={StaticResource enumBooleanConverter}, ConverterParameter=Idle}">Idle</RadioButton>
</Grid>
<Grid>
<RadioButton IsChecked="{Binding Path=CurrentMode, Converter={StaticResource enumBooleanConverter}, ConverterParameter=Active}">Active</RadioButton>
</Grid>
<Grid>
<RadioButton IsChecked="{Binding Path=CurrentMode, Converter={StaticResource enumBooleanConverter}, ConverterParameter=Disabled}">Disabled</RadioButton>
</Grid>
<Grid>
<RadioButton IsChecked="{Binding Path=CurrentMode, Converter={StaticResource enumBooleanConverter}, ConverterParameter=Running}">Running</RadioButton>
</Grid>
</StackPanel>
Это подводит меня к следующему обходному пути, который гарантирует, что нажатие кнопки не останетсяв проверенном состоянии после нажатия на него, который был необходим для запуска вызова set, поскольку вы привязываете свойство IsChecked.Вам нужно будет отправить дополнительный NotifyPropertyChanged, но он должен быть помещен в очередь потока Dispatch, чтобы кнопка получила уведомление и обновила свою визуальную привязку IsChecked.Добавьте это к вашему классу ViewModel, который, вероятно, заменяет вашу существующую реализацию NotifyPropertyChanged, и я предполагаю, что ваш класс реализует INotifyPropertyChanged, которого нет в коде вопроса:
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
Dispatcher uiDispatcher = Application.Current != null ? Application.Current.Dispatcher : null;
if (uiDispatcher != null)
{
uiDispatcher.BeginInvoke(DispatcherPriority.DataBind,
(ThreadStart)delegate()
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
});
}
}
}
Затем в вызове Setter вашего CurrentMode вызов NotifyPropertyChanged"CurrentMode").Возможно, вам уже нужно что-то подобное, так как ваш запрос ModeChanged вашего сервера, вероятно, поступает в поток, который не является потоком Dispatcher.
Наконец, вам нужно применить стиль к вашим RadioButtons, если вы хотите, чтобы они имелидругой проверенный / непроверенный вид.Быстрый поиск Google для WPF RadioButton ControlTemplate в конечном итоге пришел к этому сайту: http://madprops.org/blog/wpf-killed-the-radiobutton-star/.