次のイベント ハンドラーを、GroupBox 内の 3 つの RadioButton (Checked プロパティが Application Settings にバインドされている) のそれぞれの Click イベントに追加できます。
Private Sub RadioButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tomRadioButton.Click, dickRadioButton.Click, harryRadioButton.Click
If sender.Checked = False Then
sender.Checked = True
End If
End Sub
クリックした後、チェックされていない RadioButton がチェックされるまでに 0.5 秒かかりますが、機能します。
この問題の理由は、2 年前 (2008 年) 、Turbulent Intelect ブログのSurviving WinForms Databinding 投稿のセクション 5 で説明されました (リンクについては、 ohadscに感謝します)。
ルール 5: クリック可能なラジオ ボタンにバインドしない
一連のラジオ ボタンを列挙型プロパティにバインドできれば、どんなに素晴らしいことでしょう。本当です。Format イベントと Parse イベントをフックして列挙型に戻すだけで、すべてうまくいくと思います。実際に機能するなら、とても便利です。しかし、WinForms はこれには向いていません。現在 3 つのフル リリース (または 3.5 リリースですか?) では、これが当てはまります。これは、イベントの順序が原因であり、MS が何千人もの開発者を本当に怒らせることなく切り替えることができるものではありません。
問題は、他のコントロールのデータ プロパティとは異なり、フォーカスがラジオ ボタンから離れるまで、ラジオ ボタンの Checked プロパティが実際には変化しないという事実に帰着します。そして、すべての WinForms コントロールと同様に、フォーカスが別のコントロールに与えられるまで、実際にはフォーカスがラジオ ボタンから離れることはなく、実際には、新しくフォーカスされたコントロールの Click イベントが発生するまで続きます。この結果、ラジオ ボタンに関連するため、それらにバインドしようとすると、データソースのバインドされたプロパティは、実際にはラジオ ボタンの表示状態より 1 クリック遅れます。. ラジオ ボタンが 2 つしかない場合、データソース プロパティを参照するアクションをトリガーしない別の場所をクリックするまで、データソースは表示状態の正反対になります。これは、追跡するのが本当に腹立たしいバグになる可能性があります。幻覚かと思いました。
さて、正直なところ、それを機能させることは可能です。しかし、それはこれまでにクラッジされた中で最もクラッジなクラッジです。それほど悪くはないかもしれませんが、確かに厄介なハックです。本当にすでに利用可能になっているはずのものを手に入れるには、多くの作業が必要です。私が知る限り、データ バインディング メカニズムをあきらめずにこの問題を解決する唯一の方法は、実際に役立つプロパティ変更とイベント順序を使用して、本質的に独自の RadioButton コントロールを作成することです。ゼロから作成するか、RadioButton をサブクラス化し、すべてのイベント ロジックをカスタム メッセージ処理でオーバーライドすることができます。