2010-12-16 22 views
9

Ich arbeite in WPF 4/C#. Ich habe zwei benutzerdefinierte Klassen:WPF - Bindung an eine Eigenschaft eines benutzerdefinierten Objekts, das sich in einem anderen Objekt befindet

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

Von XAML möchte ich an Eigenschaften dieser Klassen binden. Hier ist, was ich habe:

<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> 

(hier die <my:c2 ../> instanziiert die c2-Klasse.) Der erste Textblock Werke verbindlich. Die zweite nicht. Warum kann ich nicht an eine Eigenschaft im obj1 binden? Ich bin nur in der Lage, an Eigenschaften der unmittelbaren Klasse zu binden. Ich möchte in der Lage sein, an andere Sachen wie ein Element in einem Array zu binden, das der unmittelbaren Klasse oder einer Eigenschaft einer Kindklasse gehört, wie oben gezeigt. Was vermisse ich? Wenn ich das Objekt "obj1.prop1" mit get/set in eine andere Eigenschaft der unmittelbaren Klasse einpacke, funktioniert es. Aber ich möchte das nicht tun müssen, besonders wenn ich Arrays benutze, möchte ich nicht jedes Element in eine separate Eigenschaft verpacken!

Antwort

14

Ihr obj1 ist ein Feld, keine Eigenschaft, daher können Sie nicht auf das C1-Objekt zugreifen.

Betrachten Sie stattdessen:

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

Und

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

PS. Das nächste Mal ist es besser, ein Beispiel mit Standardnamenskonventionen zu verwenden (z. B. kleingeschriebene Felder/Variablen, Großbuchstaben usw.), damit die Leute das Problem früher sehen können!

10

Sie können nicht an Felder binden, sie müssen Eigenschaften sein.

+0

Sie schlagen sich daran! – poindexter12

+0

Ich versuche, an eine Eigenschaft zu binden, es ist zufällig auf einem Kindobjekt. Tritt das Problem auf, weil das untergeordnete Objekt ein Feld ist und es keine Möglichkeit gibt, es "zu binden", um an die Eigenschaft zu gelangen? – mawrya

+0

@mawrya das Kindobjekt selbst muss auch eine Eigenschaft sein, d. H. 'Prop1' ist eine Eigenschaft auf' obj1', aber 'obj1' selbst ist keine Eigenschaft Ihrer' c2' Klasse. –

Verwandte Themen