使用StringFormat和Multibinding来格式化Label

60

我想使用StringFormat实现类似这样的功能:

<Label x:Name="myLabel">
    <Label.Content>
        <Multibinding StringFormat="{}{0} - {1}">
            <Binding Path="Lib1" />
            <Binding Path="Lib2" />
        </MultiBinding>
    </Label.Content>
</Label>

然而,它并没有起作用,我收到了以下错误信息:

MultiBinding 失败,因为它没有有效的转换器。 MultiBindingExpression:目标元素是 'Label'(名称='myLabel'); 目标属性是 'Content'(类型为 'Object')

有没有办法让这段代码工作?

3个回答

122

你无法将其绑定,因为你试图将一个字符串绑定到一个非字符串类型的对象,这是不起作用的,因为StringFormat要求其目标为字符串类型。您可以通过使用TextBlock(它具有Text属性)或将Textblock放置在Label的子级中来解决此问题:

<Label x:Name="myLabel">
    <Label.Content>
        <TextBlock>
            <TextBlock.Text>
                <MultiBinding StringFormat="{}{0} - {1}">
                    <Binding Path="Lib1" />
                    <Binding Path="Lib2" />
                 </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </Label.Content>
</Label>

1
这正是我要说的,而且这篇帖子也证实了它:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c60b90e6-8426-4c2b-a547-eaa92920862f - Tom
1
谢谢,我会使用TextBlock而不是Label。第一个解决方案也可以,但我认为第二个更优雅。 - Filimindji
6
后一种解决方案还继承了标签的风格,如果您不想给“TextBlock”设置样式,这是一个小奖励。 - Adam Houldsworth

7
对于想了解的人们,你也可以从Leom Burke的答案中省略<Label.Content>标签。这可以节省另外两行代码。
<Label x:Name="myLabel">
    <TextBlock>
        <TextBlock.Text>
           <MultiBinding StringFormat="{}{0} - {1}">
               <Binding Path="Lib1" />
               <Binding Path="Lib2" />
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>
</Label>

5
<Label>
   <AccessText>
      <MultiBinding StringFormat="{x:Static properties:Resources.MyText}">
         <Binding Path="MyObj.MyProp" Mode="OneTime"/>
      </MultiBinding>
   </AccessText>
</Label>

Resources.MyText 可以包含像“狐狸跳过 {0}。”这样的任何内容。


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