WPF - 绑定到另一个对象内部的自定义对象的属性

9

我是一名从事WPF 4 / C#开发的IT技术人员。我有两个自定义类:

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的属性?我似乎只能绑定到直接类的属性。我想要绑定到其他东西,比如属于直接类的数组中的元素或子类的属性,就像上面所示的那样。我错过了什么?如果我使用get/set将obj1.prop1包装在直接类的另一个属性中,它可以工作。但我不想这样做,特别是如果我开始使用数组,我不想将每个元素都包装成单独的属性!

2个回答

14

您的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; } }
}
And
<TextBlock DataContext="{DynamicResource c2}" Text="{Binding PropObj1.prop1}"/>

注意:下次最好使用标准命名约定的示例(例如小写字段/变量,大写属性等),以便让人们更早地发现问题!


10

你不能绑定到字段,它们必须是属性。


我正在尝试绑定一个属性,只是这个属性恰好在一个子对象上。问题出现的原因是子对象是一个字段,没有办法“绑定到”它以获取该属性吗? - mawrya
@mawrya,子对象本身也需要成为一个属性,即prop1是在obj1上的一个属性,但obj1本身不是你的c2类的一个属性。 - Kirk Broadhurst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接