トップ回答者
親クラスのプロパティの参照方法

質問
-
WPFのリストをバインディングをコーディングしています。
その際にObservableCollection 内のクラスから ObservableCollection を 含むクラスのプロパティを参照したいです。
(サンプルのコードは階層が2階層ですが 実際は3階層となっています。)下記のコードの 「this.parent.判定値」の部分の様なイメージで参照する方法はないでしょう?
public class 検査条件 { public string 検査名; public float 判定値;
public ObservableCollection<検査点> 検査点一覧; public class 検査点 { public string 測定点; public float 測定値; public bool 合格 { get { bool ret = false; if (測定値 >= this.parent.判定値 ) { ret = true; } return ret; } } } } }
クラス初心者です。
よろしくお願いいたします。
回答
-
下記のコードの 「this.parent.判定値」の部分の様なイメージで参照する方法はないでしょう?
そのような仕組みはありませんので、自分で作る必要があります。
そもそも、「検査点」というクラスから作ったオブジェクトは単独で存在でき、検査条件クラスのオブジェクトに内包されている保証はありません。
検査点オブジェクトを検査条件の ObservableCollection に登録する際に Parent 相当のプロパティに検査条件クラスが設定してあげるとか、そういった自分での作り込みが必要です。イメージ
public void Add(検査点 obj) { obj.Parent = this; 検査点一覧.Add(obj); }
- 回答としてマーク Watanabe NS 2017年9月18日 12:26
- 回答としてマークされていない Watanabe NS 2017年9月18日 12:26
- 回答の候補に設定 Tak1waMVP, Moderator 2017年9月18日 22:35
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年9月26日 4:26
-
判定値が最初に操作点一覧を表示した時から変更されないのであれば、検査点オブジェクトを生成する際に合格は決定されますので、その決定値を検査点オブジェクトは持てば良いですし、もし、途中で判定値が変わるのであれば、合格も変わる可能性がありますので、検査点クラスにINotifyPropertyChangedインターフェースを実装した方が良いと思います。
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年9月20日 0:12
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年9月26日 4:27
すべての返信
-
下記のコードの 「this.parent.判定値」の部分の様なイメージで参照する方法はないでしょう?
そのような仕組みはありませんので、自分で作る必要があります。
そもそも、「検査点」というクラスから作ったオブジェクトは単独で存在でき、検査条件クラスのオブジェクトに内包されている保証はありません。
検査点オブジェクトを検査条件の ObservableCollection に登録する際に Parent 相当のプロパティに検査条件クラスが設定してあげるとか、そういった自分での作り込みが必要です。イメージ
public void Add(検査点 obj) { obj.Parent = this; 検査点一覧.Add(obj); }
- 回答としてマーク Watanabe NS 2017年9月18日 12:26
- 回答としてマークされていない Watanabe NS 2017年9月18日 12:26
- 回答の候補に設定 Tak1waMVP, Moderator 2017年9月18日 22:35
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年9月26日 4:26
-
Azulean 様
回答ありがとうございます。「検査条件クラスのオブジェクトに内包されている保証はありません。」という事で良く分かりました。
検査点クラスに「public 検査条件 Parent;」というプロパティを用意して Add プロシージャを追加して動作の確認ができました。
分かり易いご回答ありがとうございました。
public class 検査条件 { public string 検査名; public float 判定値; public ObservableCollection<検査点> 検査点一覧 = new ObservableCollection<検査点>(); public void Add(検査点 obj) { obj.Parent = this; 検査点一覧.Add(obj); } public class 検査点 { public 検査条件 Parent; public string 測定点; public float 測定値; public bool 合格 { get { bool ret = false; if (測定値 >= Parent.判定値) { ret = true; } return ret; } } } }
- 編集済み Watanabe NS 2017年9月18日 12:34 修正コードの追加
-
判定値が最初に操作点一覧を表示した時から変更されないのであれば、検査点オブジェクトを生成する際に合格は決定されますので、その決定値を検査点オブジェクトは持てば良いですし、もし、途中で判定値が変わるのであれば、合格も変わる可能性がありますので、検査点クラスにINotifyPropertyChangedインターフェースを実装した方が良いと思います。
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年9月20日 0:12
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年9月26日 4:27
-
ご回答ありがとうございます。
実際のコードにはINotifyPropertyChangedインターフェースを実装しております。
今回の質問内容のコードを簡略化する為に省略させて頂きました。
コメント を追加した方が良かったですね。
ご指摘ありがとうございます。- 編集済み 立花楓Microsoft employee, Moderator 2017年9月28日 2:41 回答者が異なるため