Как вставить привязку в середине предложения TextBlock в WPF? - PullRequest
9 голосов
/ 10 сентября 2009

Я ищу что-то вроде этого:

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

Это, конечно, на самом деле будет отображать текст «{Binding UserName}» для пользователя, а не декодировать его, но я знаю, что вы можете сделать что-то подобное с ASP.NET, поэтому я надеюсь, что есть способ получить это работать в WPF.

Я уже знаю, что могу использовать IValueConverter ... Я ищу что-то, что я могу сделать, если возможно, чисто в разметке.

EDIT:

Основываясь на самом превосходном решении @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 = 1 и AttemptCount = 4).

Я также нашел эту ссылку полезной для определения, какие форматы ставить после двоеточия:

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

Ответы [ 5 ]

15 голосов
/ 10 сентября 2009

Вы можете использовать свойство привязки StringFormat в .NET 3.5 SP1:

<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 голос
/ 13 августа 2014

Лучший способ сделать это - использовать Runs ...

<TextBlock>
    <Run Text="Welcome"/>
    <Run Text="{Binding UserName}"/>
    <Run Text="!"/>
</TextBlock>
1 голос
/ 10 сентября 2009

Это самый простой способ смешать текст и элементы управления

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

Вы можете встроить стилизованные кнопки или другие элементы управления в.

0 голосов
/ 10 сентября 2009

Посмотрите на эту библиотеку "WPFix". Это позволяет пользователю писать лямбда-выражения в XAML. Я не использовал его в рабочем коде, только в демонстрационном коде. Я смог взять ширину формы, разделить ее на два и привязать значение к элементу управления. Обычно вам нужно создать класс конвертера, как вы описываете. Эта библиотека может быть то, что вы ищете:

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

0 голосов
/ 10 сентября 2009

Пока что я не знаю решения, которое делает это возможным точно так же, как вы его описываете. Однако в качестве обходного пути вы можете использовать несколько текстовых блоков, чтобы собрать воедино ваше предложение:

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

Это то, что я использовал до сих пор, и хотя набирать текст неудобно, кажется, это самое простое решение. Но как только вам понадобится Интернационализация, по очевидным причинам это не нужно.

...