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

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

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

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

3回答

5936閲覧

PropertyChangedイベントはどこで購読されているのか。

darudaru

総合スコア36

C#

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2020/01/12 16:32

INotifyPropertyChangedのPropertyChangedイベント購読について

 WPF(C#)の勉強をしている者です。
INotifyPropertyChangedインターフェースのPropertyChangedイベントについて、
以下のようなソースコードで
プロパティのsetterでPropertyChangedを発生させるということは理解できたのですが、
このPropertyChangedイベントは、どこで誰が購読しているのでしょうか。
(PropertyChanged += 〇〇〇 のようなコードはどこにあるのでしょうか。)
どういう原理で動いているのか知りたいです。

いろいろと調べてみたのですが力不足でした。
参考になるサイト等でも良いのでどなたかご教授いただけますでしょうか。
どうぞ宜しくお願い致します。

該当のソースコード

C#

1 public class Sample : INotifyPropertyChanged 2 { 3 public event PropertyChangedEventHandler PropertyChanged; 4 5 private void OnPropertyChanged([CallerMemberName] String propertyName = "") 6 { 7 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 8 } 9 10 private string _Test; 11 public string Test 12 { 13 get { return _Test; } 14 set 15 { 16 if (this._Test != value) 17 { 18 this._Test = value; 19 OnPropertyChanged(); 20 } 21 } 22 } 23 }

実行環境

 Visual Studio 2019 Community を使用しています。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/01/13 04:07

> このPropertyChangedイベントは、どこで誰が購読しているのでしょうか。(PropertyChanged += 〇〇〇 のようなコードはどこにあるのでしょうか。)どういう原理で動いているのか知りたいです。 その質問が意味するのは、例えば、以下の記事のサンプルコード(this.Load += new EventHandler(Form1_Load); を追加しないと動きませんが)には、PropertyChanged += 〇〇〇 というようなコードはありませんが、プロパティを変更するとバインドされた DataGridView コントロールがデータソースの変更を反映するのは何故かということでしょうか? INotifyPropertyChanged インターフェイス https://docs.microsoft.com/ja-jp/dotnet/api/system.componentmodel.inotifypropertychanged?view=netframework-4.8
darudaru

2020/01/13 13:26

ご回答ありがとうございます。 仰る通りです。そういう意味合いで質問させていただきました。
退会済みユーザー

退会済みユーザー

2020/01/13 15:26 編集

質問文を編集してそのあたりことを書いてください。タグを見ると WPF の話のようですが、であれば上のコメントのような Windows Forms アプリの記事の URLでなく、WPF の記事の URL を書いていただけると助かります。
darudaru

2020/01/13 15:15

「上のコメントのような Windows Forms アプリの記事の URLでなく、WPF の記事の UR を書いていただけると助かります。」 とは、どういう意味でしょうか。
退会済みユーザー

退会済みユーザー

2020/01/13 15:43 編集

PropertyChanged bindingsource をキーワードにググれば https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/controls/raise-change-notifications--bindingsource という記事がヒットします。Windows Forms アプリの話であれば、その記事の初めに書いてあることを読めばそういう設計になっているということで納得できるのでは? WPF の話ということですとそれでは納得できないのではと思ったのでそう言ってます(私が参照した記事の BindingSource は Windows Forms アプリ用なので)。
darudaru

2020/01/15 10:44

すみません、Bindingの仕組みについて知識が不足しており、 質問に適切な参考文献を載せる、というところまで至りませんでした。
退会済みユーザー

退会済みユーザー

2020/01/15 12:10

質問のコードは何かのサンプルをコピーしたのではないですか? もしそうであって、それがネットに公開されている記事であれば、その URL を書けませんか?
darudaru

2020/01/17 15:24

質問のコードは自分で書きました。 WPFのアプリを作っていて、質問のコードのような記述で動作的には問題なく動いていたのですが、深く考えた時にどういう仕組みで動いているのか気になったので質問させていただきました。 ですが、私の想像よりも単純なことではなさそうであったので(自動実装されるこのファイルのここで設定されてますなどを想像していました)、他の方に回答頂いたキーワードを元に改めて自分で調べ直したいと思っております。
guest

回答3

0

ベストアンサー

WPFのデータバインドには、弱いイベント パターンを使っています。
使っている実装は多分PropertyChangedEventManager クラスです。

質問の購読(AddHandlerメソッド)と購読解除(RemoveHandlerメソッド)を行っているのはWPFの実行環境ですが、
実行環境が利用しているのはBinding クラスに関連づいたBindingExpression クラスでしょう。

投稿2020/01/13 01:37

hihijiji

総合スコア4150

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

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

darudaru

2020/01/13 13:18

ご回答ありがとうございます。 私の知識不足で、教えていただいた内容やリンク先を見てもすぐには理解できませんでした。 それでも解決に繋がるキーワードをいただき、とてもありがたいです。。 弱いイベントパターンやBindingクラスについてもっと勉強してみます・・!
guest

0

直接的な回答ではありません。

.NET Frameworkの内部でどのように動作しているか気になるのでしたら
Reference Sourceを追いかけてみるのも手です。

投稿2020/01/13 13:01

YAmaGNZ

総合スコア10258

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

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

darudaru

2020/01/13 13:31

ご回答ありがとうございます。 こういったものがあったのですね・・! 参考にさせていただきます。
guest

0

Sample class を使用しているプログラムコードはありませんか?
おそらくこんな感じ

C#

1var sample = new Sample(); 2sample.PropertyChanged += (sender, name) => 3{ 4 Console.Debug($"updated {name}"); 5} 6 7sample.Test = "new string"; 8

また、WPF の XAML コードで、Test のプロパティを参照すると自動的にバインディングされます。

投稿2020/01/12 21:52

編集2020/01/12 22:05
mmaeda

総合スコア269

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

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

darudaru

2020/01/13 12:28

ご回答ありがとうございます。 XAML側でテキストボックスにTestプロパティをバインドした時などを想定しています。 「自動的なバインディング」がどのように実装されているのかが知りたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問