none
親クラスのプロパティの参照方法 RRS feed

  • 質問

  • 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; } } } } }

    クラス初心者です。
    よろしくお願いいたします。

    2017年9月18日 11:33

回答

  • 下記のコードの 「this.parent.判定値」の部分の様なイメージで参照する方法はないでしょう?

    そのような仕組みはありませんので、自分で作る必要があります。

    そもそも、「検査点」というクラスから作ったオブジェクトは単独で存在でき、検査条件クラスのオブジェクトに内包されている保証はありません。
    検査点オブジェクトを検査条件の ObservableCollection に登録する際に Parent 相当のプロパティに検査条件クラスが設定してあげるとか、そういった自分での作り込みが必要です。

    イメージ

    public void Add(検査点 obj)
    {
      obj.Parent = this;
      検査点一覧.Add(obj);
    }

    2017年9月18日 11:56
    モデレータ
  • 判定値が最初に操作点一覧を表示した時から変更されないのであれば、検査点オブジェクトを生成する際に合格は決定されますので、その決定値を検査点オブジェクトは持てば良いですし、もし、途中で判定値が変わるのであれば、合格も変わる可能性がありますので、検査点クラスにINotifyPropertyChangedインターフェースを実装した方が良いと思います。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年9月19日 10:25
    モデレータ

すべての返信

  • 下記のコードの 「this.parent.判定値」の部分の様なイメージで参照する方法はないでしょう?

    そのような仕組みはありませんので、自分で作る必要があります。

    そもそも、「検査点」というクラスから作ったオブジェクトは単独で存在でき、検査条件クラスのオブジェクトに内包されている保証はありません。
    検査点オブジェクトを検査条件の ObservableCollection に登録する際に Parent 相当のプロパティに検査条件クラスが設定してあげるとか、そういった自分での作り込みが必要です。

    イメージ

    public void Add(検査点 obj)
    {
      obj.Parent = this;
      検査点一覧.Add(obj);
    }

    2017年9月18日 11:56
    モデレータ
  • 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 修正コードの追加
    2017年9月18日 12:33
  • 判定値が最初に操作点一覧を表示した時から変更されないのであれば、検査点オブジェクトを生成する際に合格は決定されますので、その決定値を検査点オブジェクトは持てば良いですし、もし、途中で判定値が変わるのであれば、合格も変わる可能性がありますので、検査点クラスにINotifyPropertyChangedインターフェースを実装した方が良いと思います。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年9月19日 10:25
    モデレータ
  • ご回答ありがとうございます。

    実際のコードにはINotifyPropertyChangedインターフェースを実装しております。
    今回の質問内容のコードを簡略化する為に省略させて頂きました。
     コメント を追加した方が良かったですね。
    ご指摘ありがとうございます。


    2017年9月28日 2:22