如何在WPF中的文本块的句子中间插入绑定?

如何在WPF中的文本块的句子中间插入绑定?,wpf,data-binding,xaml,Wpf,Data Binding,Xaml,我在寻找以下线索: <TextBlock Grid.Column="1" Text="Welcome, {Binding UserName}!" /> 这将产生:尝试:4次中的1次(假设AttemptNumber=1和AttemptCount=4) 我还发现此链接有助于确定冒号后面要放置的格式: 到目前为止,我还不知道有哪种解决方案能够以与您描述的完全相同的方式实现这一点。但是,作为一种变通方法,您可以使用多个文本块拼凑句子: <StackPanel Orie

我在寻找以下线索:

<TextBlock
    Grid.Column="1"
    Text="Welcome, {Binding UserName}!" />
这将产生:
尝试:4次中的1次(假设
AttemptNumber=1
AttemptCount=4

我还发现此链接有助于确定冒号后面要放置的格式:


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

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


这就是我到目前为止使用的方法,虽然打字很麻烦,但它似乎是最简单的解决方案。但是,只要您需要国际化,出于明显的原因,这是不可能的。

您可以在.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>

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


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

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

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

最好的方法是使用运行

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


Whee,那太好了。尽管如此,排序还是很奇怪,因为它与通常的[string]正好相反:Format.Beautiful!这就引出了另一个问题:是否可能有多个绑定值,或者是否仅限于一个?谢谢。噢,你是在我更新答案的时候做的!哦,好吧!:)@Johannes你可以像String.Format一样排序:Text=“{Binding StringFormat=”…”,Path=UserName“@Matt:Haha,我想有两个例子也没什么坏处。关于大括号的转义有一些奇怪的规则,我还没有完全掌握。注意,在我的示例中,我使用了
{}
StringFormat
的开头。在最初的示例中,您使用了
\{
\}
。然后,您根本不需要为第二个示例转义。此外,它拒绝了我的整数绑定,直到我添加了
:G
(“常规”格式)抛开这些怪事不谈,
StringFormat
有了一个新的粉丝。我以前用过一个
StackPanel
把属性值对串在一起(例如,“Status:Successful”),但我有点担心用它把句子的不同部分串在一起,因为我认为自然的文本间距可能不会被保留(也就是说,
TextBlock
之间的间隔比相同
TextBlock
的单词之间的间隔要大。不过,如果这不是问题,这是一个很好的解决方案。到目前为止,我没有注意到额外的空间。但是,紧排很可能不会像自动连字等那样起作用。基本上,你会将文本分成不同的段,而我毫无疑问,高级排版技术在这些项目中是有效的。但对于一些项目来说,i18n部分是一个相当严肃的部分,我避免将字符串和变量连接起来,或者尽可能使用非位置格式字符串。不过,有时像这样的快速而肮脏的解决方案仍然存在:-)
<TextBlock>
    <Run Text="Welcome"/>
    <Run Text="{Binding UserName}"/>
    <Run Text="!"/>
</TextBlock>