質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

3回答

2301閲覧

FormアプリケーションのINotifyPropertyChangedの実装について

anonymousss

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2018/03/15 05:52

編集2018/03/15 06:47

前提・実現したいこと

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"); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Bindingの仕組みを根本的に理解されていないように思います。
余計なお世話かもしれませんが闇雲に尋ねたりせず、サンプル等でしっかり理解されたほうが良いのでは?

■bindingSourceの発火元になるのはFormなのですから

this.bindingSource.DataSource = this;

では?

■発火元となるFormのプロパティ currentValue をBindしたいのなら

this.TextBox.DataBinding.Add("Text", bindingSource, "currentValue");

です。

あとBindするプロパティはPublicじゃなきゃダメなはず

public int currentValue { // コンボボックスの値がXなら0、そうでなければ1をテキストボックスに表示 get { this.ComboBox.SelectedValue.ToString() == "X" ? 0 : 1; } }

投稿2018/03/15 08:40

ebiryo

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

前の質問 が解決したならベストアンサーを決めてください。
そこで少し触れているようにコントロールとバインドしなければなりません。

バインドはデザイナからできますしその方が簡単です。
コードでやりたいなら DataBindings プロパティと Bindings クラスについて調べてください。

投稿2018/03/15 06:12

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anonymousss

2018/03/15 06:20

ベストアンサー忘れていました。 前回の回答頂いた実装で自分なりに改変してみたのですがうまくいきません。 バインドはできているとおもうのですが...
Zuishin

2018/03/15 06:29

Form は INotifyPropertyChanged をすでに実装していますので追加することはできません。 このコードはコンパイルできないはずです。 あと前回の私の回答の次の部分 args.Value += "が選択中"; これを args.Value = args.Value == "X" ? "0" : "1"; に変更するだけでここまでしなくとも望みの動作になるのではないかと思います。
Zuishin

2018/03/15 06:35

あと、編集前の質問にあった INotifyPropertyChanged の実装についての記述を元に戻し、新しい情報は追記とわかるように追記してください。 でないと今の質問にある問題だらけのソースを見て Tak1wa さんが問題ないとおっしゃっているように見えます。
anonymousss

2018/03/15 07:04

消した部分は戻しておきました。 コンパイルができることは確認しています。 FormはINotyfiPropertyChangedを実装しているとはどういうことでしょうか? WPFの知識が少しだけあったものでそれに寄せるためプロパティを分け変更通知を実施するという実装を行ってみたかったのですが。。。
Zuishin

2018/03/15 07:13

すみません。記憶違いでした。 Form は INotifyPropertyChanged を実装していません。 とりあえず今回はどこにもバインドされていない Form が INotifyPropertyChanged を実装する必要はありません。 バインドされているのは BindingSource です。 BindingSource は TextBox と ComboBox の両方にバインドされているので、コンボボックスの SelectedValueChanged も不要です。SelectedValue の変化は BindingSource が TextBox に通知してくれます。 ComboBox の変更によって TextBox の値が変わることは前回示した通りです。 今回もやっていることは同じで「が選択されています」が「0 か 1」に変わっただけだと思います。 であるなら、その部分の変更だけで対応できるのではないですか? 変更方法については二つ前のコメントで示しました。
anonymousss

2018/03/16 01:08

INotifyPropertyChangedを実装するのはバインドされているクラスなんですね。 勘違いをしていました。
Zuishin

2018/03/16 01:17 編集

バインドされているのは ComboBox と BindingSource の対、そして TextBox と BindingSource の対なので、Form は関係ありません。 それらは Form のプロパティなので公開してバインドするという手もあります(ebiryo さんの方法)が、 Form のプロパティ同士をバインドするよりコントロールとデータをバインドする方が素直かと思います。 このためだけに公開・非公開を決めるのもどうかと思いますし。 もっともシナリオによってはプロパティ同士をバインドした方がいい時もありますが、今回はリストデータが用意されているので。
guest

0

こんにちは。

INotifyPropertyChangedの実装は問題ないように見えますが、
PropertyChangedの購読部分のコードも掲載できますか?

WPFだとXamlからバインドしてたりしますが、
WinFormsだとどのようにバインドしているのだろう。

投稿2018/03/15 06:01

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問