WPF MultiBinding到Model.ChildProperty不起作用?

时间:2015-05-14 19:49:49

标签: c# wpf

我在表单上有一些标签。有些工作,有些则没有。不同之处在于,不工作的设置为多重绑定,但在这个特定情况下,它们似乎无法正确绑定。

以下是两个标签的示例,一个工作,一个不工作。它们都与父级共享同一个Grid,并且我绑定的对象设置为页面的DataContext,因此它们也应该共享Context。

Context对象基本上采用的形式(为隐私/安全性而抽象)

class Model {
    public SubModel Parent {get;set;}
}
class SubModel {
    public string PropA {get;set;}
    public string PropB {get;set;}
    public string PropC {get;set;}
}

使用:

<Label Content="{Binding Parent.PropA}"/>

不起作用:

<Label>
    <Label.Content>
        <MultiBinding StringFormat="{}{0} {1}">
            <Binding Path="Parent.PropB"/>
            <Binding Path="Parent.PropC"/>
        </MultiBinding>
    </Label.Content>
</Label>

我知道这种语法有效,因为我有一些其他MultiBindings采用相同的形式和工作,不同的是他们的页面直接绑定到&#34; Parent&#34;,他们的绑定看起来更像< / p>

<Binding Path="PropB"/>

问题似乎是在使用标记并尝试引用绑定Context的子属性的子属性时。为什么会发生这种情况?我该如何解决这个问题?

我还尝试将Label本身的DataContext绑定到Parent对象,这也不起作用。

为什么会发生这种情况?如何在不在容器上创建大量不同的DataContexts并以此方式捣乱的情况下解决这个问题?

1 个答案:

答案 0 :(得分:4)

绑定的StringFormat属性仅在绑定的source属性为string类型时应用。

Label的Content属性属于object类型,因此StringFormat未应用,绑定系统会抱怨缺少多重绑定转换器。< / p>

使用TextBlock而不是Label时,目标属性为Text,其类型为字符串。因此,StringFormat将应用:

<TextBlock>
    <TextBlock.Text>
        <MultiBinding StringFormat="{}{0} {1}">
            <Binding Path="Parent.PropB"/>
            <Binding Path="Parent.PropC"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

即使只有一个绑定,以下工作:

<TextBlock Text="{Binding Parent.PropA, StringFormat=Content: {0}}"/>

但是这不是:

<Label Content="{Binding Parent.PropA, StringFormat=Content: {0}}"/>

但是,Label有ContentStringFormat属性:

<Label Content="{Binding Parent.PropA}" ContentStringFormat="Content: {0}"/>