2010-12-16 12 views
9

Pracuję w WPF 4/C#. Mam dwie niestandardowe klasy:WPF - powiązanie z właściwością niestandardowego obiektu znajdującego się wewnątrz innego obiektu

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

Z poziomu XAML chcę powiązać właściwości tych klas. Oto co mam:

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

(tutaj <my:c2 ../> instancję klasy C2). Pierwszy TextBlock wiążące prace. Drugi nie. Dlaczego nie mogę powiązać właściwości z obiektem obj1? Wydaje mi się, że tylko jestem w stanie powiązać właściwości natychmiastowej klasy. Chcę móc powiązać inne elementy, takie jak element w tablicy, która należy do bezpośredniej klasy lub właściwości klasy potomnej, jak pokazano powyżej. czego mi brakuje? Jeśli zawiń obiekt obj1.prop1 w inną właściwość bezpośredniej klasy za pomocą polecenia get/set, to działa. Ale nie chcę tego robić, szczególnie jeśli zacznę używać tablic, nie chcę zawijać każdego elementu w oddzielną właściwość!

Odpowiedz

14

Twoje jest polem, a nie właściwością, dlatego nie można uzyskać dostępu do obiektu C1.

Rozważ to zamiast:

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

I

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

PS. Następnym razem lepiej będzie użyć przykładu ze standardowymi konwencjami nazewnictwa (np. Małe pola/zmienne, wielkie litery itp.), Aby szybciej zobaczyć problem!

10

Nie można powiązać z polami, muszą to być właściwości.

+0

Musisz pokonać to! – poindexter12

+0

Próbuję powiązać właściwość, po prostu dzieje się na obiekcie podrzędnym. Czy problem występuje, ponieważ obiekt podrzędny jest polem i nie ma sposobu, aby "powiązać przeszłość", aby dostać się do nieruchomości? – mawrya

+0

@mawrya sam obiekt podrzędny również musi być właściwością, tj. 'Prop1' jest właściwością na' obj1', ale 'obj1' nie jest właściwością twojej klasy' c2'. –

Powiązane problemy