前提・実現したいこと
INotifyPropertyChangedを実装しバインドされたプロパティの変更通知を送りたい
発生している問題・エラーメッセージ
https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/change-notification-in-windows-forms-data-binding
https://garafu.blogspot.jp/2014/09/wpf-inotifypropertychanged.html
上記を参考にOnPropertyChanged()
を実装したがPropertyChanged
が常にnull
なので何も怒らない。
どこの実装例を見てもPropertyChanged
にイベントハンドラは登録されておらずなぜこれで変更の通知ができるのかわからない。
該当のソースコード
参考ページのソースになります。
実際にはFormアプリケーションでINotifyPropertyChanged
の実装は全く同じ。
C#
1namespace WpfApplication.ViewModels 2 using System.ComponentModel; 3 using System.Runtime.CompilerServices; 4 /// <summary> 5 /// ViewModel 基底クラス を表現します。 6 /// </summary> 7 public class ViewModelBase : INotifyPropertyChanged 8 { 9 /// <summary> 10 /// プロパティ値が変更されたことをクライアントに通知します。 11 /// </summary> 12 public event PropertyChangedEventHandler PropertyChanged; 13 /// <summary> 14 /// PropertyChanged イベント を発生させます。 15 /// </summary> 16 /// <param name="propertyName">変更されたプロパティの名前</param> 17 protected void OnPropertyChanged([CallerMemberName] string propertyName = "") 18 { 19 if (this.PropertyChanged != null) 20 { 21 this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 22 } 23 } 24 }
以下のように使用しています。
public class Form1 : Form, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } public Form1() { InitializeComponent(); // コンボボックスにリストを設定 this.ComboBox.DataSource = list; // リスト以外から選択不可 this.ComboBox.DropDownStyle = ComboBoxStyle.DropDownList; // バインディングソースのついか this.bindingSource.DataSource = currentValue; // テキストボックスにバインドを設定 this.TextBox.DataBinding.Add("Text", bindingSource, null); // コンボボックス選択値変更イベントハンドラ登録 this.ComboBox.SelectedValueChanged += new EventHandler(SelectedValueChanged); } List<string> list = new List<string() { "X", "Y" }; int currentValue { // コンボボックスの値がXなら0、そうでなければ1をテキストボックスに表示 get { this.ComboBox.SelectedValue.ToString() == "X" ? 0 : 1; } } void SelectedValueChanged(object sender, EventArgs e) { // 変更を通知 OnPropertyChanged("currentValue"); } }

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