2010-12-16 333 views
9

Je travaille dans WPF 4/C#. J'ai deux classes personnalisées:WPF - liaison à une propriété d'un objet personnalisé situé dans un autre objet

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

De XAML, je veux lier aux propriétés de ces classes. Voici ce que j'ai:

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

(ici le <my:c2 ../> instancie la classe c2.) Les premiers travaux de liaison TextBlock. La seconde ne le fait pas. Pourquoi ne puis-je pas lier à une propriété sur l'obj1? Je semble seulement être en mesure de se lier à des propriétés de la classe immédiate. Je veux être capable de lier à d'autres choses comme un élément dans un tableau qui appartient à la classe immédiate ou une propriété d'une classe enfant, comme indiqué ci-dessus. Qu'est-ce que je rate? Si j'enveloppe obj1.prop1 dans une autre propriété de la classe immédiate en utilisant get/set, cela fonctionne. Mais je ne veux pas avoir à faire cela, surtout si je commence à utiliser des tableaux, je ne veux pas envelopper chaque élément dans une propriété séparée!

Répondre

14

Votre obj1 est un champ, pas une propriété, donc vous ne pouvez pas accéder à l'objet C1.

Tenir compte ceci:

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

Et

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

PS. La prochaine fois, il vaut mieux utiliser un exemple avec des conventions de nommage standard (par exemple des champs/variables en minuscules, des propriétés en majuscules, etc.) pour permettre aux gens de voir le problème plus tôt!

10

Vous ne pouvez pas lier des champs, ils doivent être des propriétés.

+0

Vous battez-vous! – poindexter12

+0

J'essaie de lier à une propriété, il se trouve juste sur un objet enfant. Le problème se produit-il parce que l'objet enfant est un champ et qu'il n'y a aucun moyen de le «lier» pour accéder à la propriété? – mawrya

+0

@mawrya l'objet enfant lui-même doit également être une propriété, c'est-à-dire que 'prop1' est une propriété de' obj1', mais 'obj1' lui-même n'est pas une propriété de votre classe' c2'. –