状態を表すクラスを作成できます (これは、ここよりもはるかに適切に記述できます)。また、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));
}
}
次に、UI コントロールをデータ バインドします。
var state = new ControlState();
controlRedOne.DataBindings.Add("Checked", state, "RedOneChecked");