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