2010-12-16 17 views
9

私はWPF 4/C#で作業しています。私は2つのカスタムクラスを持っています:WPF - 別のオブジェクトの内部にあるカスタムオブジェクトのプロパティへのバインド

public class c1 { 
    public string prop1 { get; set; } 

    public c1() { 
     prop1 = "world"; 
    } 
} 

public class c2 { 
    public string prop1 { get; set; } 
    public c1 obj1 = new c1(); 

    public c2() { 
     prop1 = "hello"; 
    } 
} 

XAMLの中から、これらのクラスのプロパティにバインドしたいと思います。ここで私が持っているものです。

<Window.Resources> 
    <my:c2 x:Key="c2"/> 
</Window.Resources> 
<StackPanel> 
    <TextBlock DataContext="{DynamicResource c2}" Text="{Binding prop1}"/> 
    <TextBlock DataContext="{DynamicResource c2}" Text="{Binding obj1.prop1}"/> 
</StackPanel> 

(ここで<my:c2 ../>がC2クラスをインスタンス化します。)作品を結合最初のTextBlockを。第二はしません。 obj1のプロパティにバインドできないのはなぜですか?私は直接のクラスのプロパティにバインドできるように思えるだけです。上記のように、直接クラスに属する配列の要素や子クラスのプロパティのような他のものにバインドできるようにしたい。私は何が欠けていますか? get/setを使用して直接クラスの別のプロパティにobj1.prop1をラップすると、それは機能します。しかし、私はそれをやりたくはありません。特に、配列を使い始めると、それぞれの要素を別のプロパティにラップしたくないのです!

答えて

14

obj1はプロパティではなくフィールドなので、C1オブジェクトにアクセスすることはできません。

public class c2 { 
    public string prop1 { get; set; } 
    private readonly c1 _obj1; 

    public c2() { 
     prop1 = "hello"; 
     _obj1 = new c1(); 
    } 

    public c1 PropObj1 { get { return _obj1; } } 
} 

そして

<TextBlock DataContext="{DynamicResource c2}" Text="{Binding PropObj1.prop1}"/> 

PS:

ではなく、この考えてみましょう。次回は、標準の命名規則(例:小文字のフィールド/変数、大文字のプロパティなど)を使用して、人々が問題をより早く見ることができるようにしてください。

10

フィールドにバインドすることはできません。プロパティにする必要があります。

+0

あなたはそれに勝つ! – poindexter12

+0

私はプロパティにバインドしようとしていますが、それはちょうど子オブジェクトに存在します。子オブジェクトがフィールドであり、プロパティに到達するためにそれを「過去にバインド」する方法がないため、問題が発生していますか? – mawrya

+0

@mawrya子オブジェクト自体もプロパティである必要があります。つまり、 'prop1'は' obj1'のプロパティですが、 'obj1'自体は' c2'クラスのプロパティではありません。 –

関連する問題