我在表单上有一些标签。有些工作,有些则没有。不同之处在于,不工作的设置为多重绑定,但在这个特定情况下,它们似乎无法正确绑定。
以下是两个标签的示例,一个工作,一个不工作。它们都与父级共享同一个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并以此方式捣乱的情况下解决这个问题?
答案 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}"/>