C# WPF多重绑定到Model.ChildProperty不';不行?
我在表格上有一些标签。有些工作,有些不工作。不同之处在于,不起作用的绑定被设置为多绑定,但在这个特定实例中,它们似乎无法正确绑定 下面是两个标签的示例,一个正常,一个不正常。它们都与父对象共享同一个网格,并且我绑定到的对象被设置为页面的DataContext,因此它们也应该共享上下文 上下文对象基本上采用以下形式(为了隐私/安全而抽象) 作品:C# WPF多重绑定到Model.ChildProperty不';不行?,c#,wpf,C#,Wpf,我在表格上有一些标签。有些工作,有些不工作。不同之处在于,不起作用的绑定被设置为多绑定,但在这个特定实例中,它们似乎无法正确绑定 下面是两个标签的示例,一个正常,一个不正常。它们都与父对象共享同一个网格,并且我绑定到的对象被设置为页面的DataContext,因此它们也应该共享上下文 上下文对象基本上采用以下形式(为了隐私/安全而抽象) 作品: <Label Content="{Binding Parent.PropA}"/> 不起作用: <Label> &
<Label Content="{Binding Parent.PropA}"/>
不起作用:
<Label>
<Label.Content>
<MultiBinding StringFormat="{}{0} {1}">
<Binding Path="Parent.PropB"/>
<Binding Path="Parent.PropC"/>
</MultiBinding>
</Label.Content>
</Label>
我知道这种语法是有效的,因为我有一些其他的多重绑定,它们采用相同的形式和工作方式,不同的是它们的页面直接绑定到“Parent”,它们的绑定看起来更像
<Binding Path="PropB"/>
问题似乎是在使用标记并尝试引用绑定上下文的子属性的子属性时。为什么会发生这种情况?我该如何应对
我还尝试将标签本身的DataContext绑定到父对象,这也不起作用
为什么会发生这种情况?我如何才能避免这种情况,而不在容器上创建一堆不同的数据上下文并以这种方式进行处理?绑定的
StringFormat
属性仅在绑定的源属性类型为string
时才应用
标签的Content
属性的类型为object
,因此未应用StringFormat
,并且绑定系统抱怨缺少多绑定转换器
使用TextBlock而不是标签时,目标属性将是Text
,类型为string。因此,StringFormat将通过以下方式应用:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} {1}">
<Binding Path="Parent.PropB"/>
<Binding Path="Parent.PropC"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
绑定的
StringFormat
属性仅在绑定的源属性类型为string
时应用
标签的Content
属性的类型为object
,因此未应用StringFormat
,并且绑定系统抱怨缺少多绑定转换器
使用TextBlock而不是标签时,目标属性将是Text
,类型为string。因此,StringFormat将通过以下方式应用:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} {1}">
<Binding Path="Parent.PropB"/>
<Binding Path="Parent.PropC"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
看看VisualStudio中的输出窗口。您收到一条绑定错误消息。您是对的,我是对的,它要求我提供一个多值转换器。为什么我需要为此绑定指定转换器,但如果同一属性被指定为顶级属性,我就不需要指定转换器?问题是,为什么要使用标签而不是文本块?如果没有转换器,绑定TextBlock的Text属性就可以这样工作。因为我不知道这一点,而且我也看不出为什么当标签在其他地方工作时,将字符串数据绑定到标签上与将其绑定到TextBlock有什么不同?这解决了我眼前的问题,谢谢。区别:
Label
是一个ContentControl
。它的主要属性是Content
,它接受一个对象,通常通过ContentPresenter
显示,除非您覆盖它。TextBlock
具有Text
属性,该属性只接受一个字符串
,在您的情况下不需要转换。请查看Visual Studio中的输出窗口。您收到一条绑定错误消息。您是对的,我是对的,它要求我提供一个多值转换器。为什么我需要为此绑定指定转换器,但如果同一属性被指定为顶级属性,我就不需要指定转换器?问题是,为什么要使用标签而不是文本块?如果没有转换器,绑定TextBlock的Text属性就可以这样工作。因为我不知道这一点,而且我也看不出为什么当标签在其他地方工作时,将字符串数据绑定到标签上与将其绑定到TextBlock有什么不同?这解决了我眼前的问题,谢谢。区别:Label
是一个ContentControl
。它的主要属性是Content
,它接受一个对象,通常通过ContentPresenter
显示,除非您覆盖它。TextBlock
具有Text
属性,该属性只接受一个字符串
,在您的情况下不需要进行转换。啊,这对我来说现在更有意义了。谢谢你的解释!啊,这对我来说更有意义了。谢谢你的解释!
<TextBlock Text="{Binding Parent.PropA, StringFormat=Content: {0}}"/>
<Label Content="{Binding Parent.PropA, StringFormat=Content: {0}}"/>
<Label Content="{Binding Parent.PropA}" ContentStringFormat="Content: {0}"/>