У вас может быть класс, представляющий состояние (которое может быть написано намного лучше, чем здесь). И используйте INotifyPropertyChanged и Binding для управления состоянием кнопок. Я не совсем уверен, что это «великий» способ сделать это. Но это один из способов (и я думаю, что это может немного повлиять на шаблон наблюдателя, упомянутый в другом ответе).
Первый класс, который представляет состояние:
public class ControlState : INotifyPropertyChanged
{
private bool _redOneChecked;
public bool RedOneChecked {
get { return _redOneChecked; }
set
{
OnPropertyChanged("RedOneChecked");
_redOneChecked = value;
RedTwoChecked = RedOneChecked;
GreenOneChecked = !RedTwoChecked;
}
}
private bool _redTwoChecked;
public bool RedTwoChecked
{
get { return _redTwoChecked; }
set
{
OnPropertyChanged("RedTwoChecked");
_redTwoChecked = value;
RedOneChecked = RedTwoChecked;
GreenOneChecked = !RedTwoChecked;
}
}
private bool _greenOneChecked;
public bool GreenOneChecked
{
get { return _greenOneChecked; }
set
{
OnPropertyChanged("GreenOneChecked");
_greenOneChecked = value;
RedOneChecked = !GreenOneChecked;
RedTwoChecked = !GreenOneChecked;
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
, а затем управления пользовательского интерфейса привязки данных:
var state = new ControlState();
controlRedOne.DataBindings.Add("Checked", state, "RedOneChecked");