Как привязать несколько значений к одному текстовому блоку WPF?

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

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

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

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

4 ответов


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

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

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

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


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

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

<TextBlock>
  <Run Text="Name = "/>
  <Run Text="{Binding Name}"/>
  <Run Text=", Id ="/>
  <Run Text="{Binding Id}"/>
</TextBlock>

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

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

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


использовать 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}}" />