###前提・実現したいこと
C#のWinFormでラジオボタンとデータバインドを行うことで躓いています。
ラジオボタンは複数あって、グループボックスに入っています。
###発生している問題・エラーメッセージ
ラジオボタンとデータクラスはバインドできているのですが、
ラジオボタンの見た目の変更とデータのtrue/falseのタイミングが一致しなくて困っています。
保存メニューを作ったのですが、見た目のデータとテキストに書かれるデータが違うのです。
###該当のソースコード
なんでもないソースですが、Formとデータクラスを示します。
C#
1using System; 2using System.IO; 3using System.Windows.Forms; 4 5namespace WinFormApp 6{ 7 public partial class Form1 : Form 8 { 9 private RadioData radio_data = new RadioData(); 10 public Form1() 11 { 12 InitializeComponent(); 13 } 14 15 private void Form1_Load( object sender, EventArgs e ) 16 { 17 RadioBinder.DataSource = this.radio_data; 18 } 19 20 private void SaveToolStripMenuItem_Click( object sender, EventArgs e ) 21 { 22 File.WriteAllText( @"save.txt", radio_data.radio_type.ToString() ); 23 } 24 } 25}
C#
1using System; 2 3namespace WinFormApp 4{ 5 public class RadioData : Utility.BaseData // ここも公開した方がいいんですかね 6 { 7 public enum RadioType { UNDIFINED, TYPE1, TYPE2, TYPE3 } 8 public RadioData() { Radio1 = true; } 9 10 private RadioType _radio_type = RadioType.TYPE1; 11 public RadioType radio_type 12 { 13 get { return _radio_type; } 14 set { 15 if ( _radio_type == value ) return; 16 if ( !Enum.IsDefined( typeof( RadioType ), value ) ) { 17 throw new ArgumentOutOfRangeException(); 18 } 19 _radio_type = value; 20 NotifyEvent(); 21 } 22 } 23 public bool Radio1 24 { 25 get { return radio_type == RadioType.TYPE1; } 26 set { radio_type = value ? RadioType.TYPE1 : RadioType.UNDIFINED; } 27 } 28 29 public bool Radio2 30 { 31 get { return radio_type == RadioType.TYPE2; } 32 set { radio_type = value ? RadioType.TYPE2 : RadioType.UNDIFINED; } 33 } 34 35 public bool Radio3 36 { 37 get { return radio_type == RadioType.TYPE3; } 38 set { radio_type = value ? RadioType.TYPE3 : RadioType.UNDIFINED; } 39 } 40 41 #region IDataErrorInfo 42 public override string Error { get { return null; } } 43 #endregion 44 } 45}
基底クラスでINotifyPropertyChangedを実装しています。
using System.Collections.Generic; using System.ComponentModel; using System.Runtime.CompilerServices; namespace Utility { public abstract class BaseData : System.ComponentModel.IDataErrorInfo , System.ComponentModel.INotifyPropertyChanged { protected BaseData() { _errors = new Dictionary<string, string>(); } #region IDataErrorInfo Interface protected Dictionary<string,string> _errors; protected bool HasError { get { return _errors.Count != 0; } } protected void AddError( string Message, [CallerMemberName] string propertyName = "" ) { _errors [propertyName] = Message; } protected void RemoveError( [CallerMemberName] string propertyName = "" ) { _errors.Remove( propertyName ); } public virtual string Error { get { return null; } } public string this [string name] { get { return _errors.ContainsKey( name ) ? _errors [name] : null; } } #endregion #region INotifyPropetyChanged public event PropertyChangedEventHandler PropertyChanged; public void NotifyEvent( [CallerMemberName] string propertyName = "" ) { PropertyChanged?.Invoke( this, new PropertyChangedEventArgs( propertyName ) ); } #endregion } }
###試したこと
更新タイミングをOnPropertyChangedに変えると、2つのプロパティにfalseが入ってきました。
※R1がcheckedだったので、R2をクリックした場合
一応、更新タイミングをOnPropertyChangedにしたうえでイベントを作るとうまくいくようにはなりました。
C#
1private void radioButton_Click( object sender, EventArgs e ) 2{ 3 ( (RadioButton)sender ).Checked = true; 4}
イベントを書かずに、データクラスやバインドだけで実現できないものなのでしょうか?
WPFでは出来るようですが......
不勉強なところが多々あるコードだとは思いますが、よろしくお願いいたします。
###補足情報
Windows 10
Visual Studio 2015
で開発しています。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。