如何在WPF中的TextBlock的句子中间插入绑定?

时间:2009-09-09 22:56:36

标签: wpf data-binding xaml

我正在寻找这些方面的东西:

<TextBlock
    Grid.Column="1"
    Text="Welcome, {Binding UserName}!" />

这当然会实际向用户显示文本“{Binding UserName}”而不是解码它,但我知道你可以用ASP.NET做这样的事情,所以我希望有办法让这个在WPF工作。

我已经知道我可以使用IValueConverter ...我正在寻找一些我可以在标记中做的事情。如果可能的话。

修改

基于@Matt Hamilton最优秀的解决方案,我尝试使用TextBlock推送信封并将两个值绑定到同一个MultiBinding。像魅力一样:

<TextBlock
    Style="{StaticResource TextBlock_ValueStyle}"
    Grid.Column="1">
    <TextBlock.Text>
        <MultiBinding
            StringFormat="{}Attempts: {0:G} of {1:G}">
            <Binding
                Path="AttemptNumber" />
            <Binding
                Path="AttemptCount" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

这会产生:Attempts: 1 of 4(假设AttemptNumber = 1AttemptCount = 4)。

我还发现此链接有助于确定在冒号后放置哪些格式:

http://msdn.microsoft.com/en-us/library/fbxft59x.aspx

5 个答案:

答案 0 :(得分:15)

您可以在.NET 3.5 SP1中使用StringFormat绑定属性:

<TextBlock Text="{Binding UserName,StringFormat='Welcome, \{0\}!'}" />

请注意,您需要使用反斜杠转义字符串格式的花括号。

更新是的,还支持多个值:

<TextBlock>
    <TextBlock.Text>
        <MultiBinding StringFormat="Welcome, {0} {1}!">
            <Binding Path="FirstName" />
            <Binding Path="LastName" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

答案 1 :(得分:1)

这是混合文本和控件的最简单方法

<TextBlock>Welcome, <TextBlock Text="{Binding UserName}"/>!</TextBlock>

您可以将样式化按钮或其他控件内联到。

答案 2 :(得分:1)

最好的方法是使用Runs ...

<TextBlock>
    <Run Text="Welcome"/>
    <Run Text="{Binding UserName}"/>
    <Run Text="!"/>
</TextBlock>

答案 3 :(得分:0)

到目前为止,我还不知道一种解决方案能够以与您描述它完全相同的方式实现这一点。但是,作为一种变通方法,您可以使用多个文本块拼凑您的句子:

<StackPanel Orientation="Horizontal">
    <TextBlock Text="Welcome, "/>
    <TextBlock Text="{Binding UserName}"/>
    <TextBlock Text="!"/>
</StackPanel>

这是我到目前为止使用的,虽然输入它很麻烦似乎是最简单的解决方案。但是,一旦你需要国际化,这显然是一个不可取的原因。

答案 4 :(得分:0)

看看这个库“WPFix”。它允许用户在XAML中编写lambda表达式。我没有在生产代码中使用它,只在演示代码中使用它。我能够获取表单的宽度,将其除以2,并将值绑定到控件。通常,您需要创建一个转换器类,如您所述。这个库可能是您正在寻找的东西:

http://www.fikrimvar.net/lestirelim/?p=15