WPF-привязка к свойству пользовательского объекта, находящегося внутри другого объекта

Я работаю в WPF 4 / C#. У меня есть два пользовательских класса:

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? Кажется, я могу привязываться только к свойствам непосредственного класса. Я хочу иметь возможность связываться с другими вещами, такими как элемент в массиве, который принадлежит непосредственному классу или свойству дочернего класса, как показано выше. Что я упускаю? Если я оберну obj1.prop1 в другом свойстве класса immediate, использующем get / set, он работает. Но я не хочу этого делать, особенно если я начну использовать массивы, я не хочу упаковывать каждый элемент в отдельное свойство!

2 ответов


код 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. В следующий раз лучше использовать пример со стандартными соглашениями об именах (например, поля/переменные нижнего регистра, свойства верхнего регистра и т. д.), чтобы люди могли увидеть проблему раньше!


вы не можете привязываться к полям, они должны быть свойствами.