Как привязать несколько значений к одному текстовому блоку WPF? - PullRequest
180 голосов
/ 31 марта 2010

В настоящее время я использую TextBlock ниже, чтобы связать значение свойства с именем Name:

<TextBlock Text="{Binding Name}" />

Теперь я хочу связать другое свойство с именем ID с тем же TextBlock.

Возможно ли связать два или более значений с одним и тем же TextBlock? Можно ли это сделать с помощью простой конкатенации, такой как Name + ID, и, если нет, как еще это можно сделать?

Ответы [ 4 ]

383 голосов
/ 31 марта 2010

Вы можете использовать MultiBinding в сочетании со свойством StringFormat. Использование будет выглядеть следующим образом:

<TextBlock>
    <TextBlock.Text>    
        <MultiBinding StringFormat="{}{0} + {1}">
            <Binding Path="Name" />
            <Binding Path="ID" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

Учитывая значение Name Foo и значение для ID 1, которое вы выводите в TextBlock, будет Foo + 1.

Note:, что это поддерживается только в .NET 3.5 SP1 и 3.0 SP2 или более поздней версии.

117 голосов
/ 06 июня 2012

Я знаю, что это слишком поздно, но я решил добавить еще один способ сделать это.

Вы можете воспользоваться тем, что свойство Text можно установить с помощью « Run s», так что вы можете установить несколько привязок, используя Run для каждой из них. Это полезно, если у вас нет доступа к MultiBinding (чего я не нашел при разработке для Windows Phone)

<TextBlock>
  <Run Text="Name = "/>
  <Run Text="{Binding Name}"/>
  <Run Text=", Id ="/>
  <Run Text="{Binding Id}"/>
</TextBlock>
21 голосов
/ 31 марта 2010

Если это просто текстовые блоки (и, следовательно, одностороннее связывание), и вы просто хотите объединить значения, просто связайте два текстовых блока и поместите их в горизонтальную панель стека.

    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Name}"/>
        <TextBlock Text="{Binding ID}"/>
    </StackPanel>

Это отобразит текст (что и делают все текстовые блоки) без необходимости больше кодировать. Вы могли бы наложить на них небольшое поле, чтобы они выглядели правильно.

10 голосов
/ 31 марта 2010

Использовать ValueConverter

[ValueConversion(typeof(string), typeof(String))]
public class MyConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return string.Format("{0}:{1}", (string) value, (string) parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {

        return DependencyProperty.UnsetValue;
    }
}

и в разметке

<src:MyConverter x:Key="MyConverter"/>

. , .

<TextBlock Text="{Binding Name, Converter={StaticResource MyConverter Parameter=ID}}" />
...