如何将多个值绑定到单个WPF TextBlock?


210

我目前正在使用TextBlock以下方法绑定名为的属性的值Name

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

现在,我想将另一个属性绑定ID到same TextBlock

是否可以将两个或多个值绑定到相同的值TextBlock?是否可以通过简单的串联来完成,例如Name + ID,如果不是,还可以如何实现?

Answers:


434

您可以将其MultiBindingStringFormat属性结合使用。用法类似于以下内容:

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

赋予NameFooID1,则TextBlock中的输出将为Foo + 1

Note: .NET 3.5 SP1和3.0 SP2或更高版本仅支持此功能。


5
@Preet-实际上不确定在这种情况下是否需要使用'{}',我将其包括在内,因为它是在MSDN示例中使用的。但是,通常,它需要作为XAML解析器的转义序列,以避免与Binding标记扩展混淆。
理查德·麦圭尔

2
这有一个副作用。DataGrid不幸的是,如果您在某种排序行为中使用此方法,将无法正常工作。一个更合适的解决方案是在您的模型中创建一个具有绑定的合适字符串格式的只读属性。不用说,这是一种快速格式化的巧妙方法,尽管有点冗长。
Brett Ryan

34
如果格式字符串以参数{0}开头,则只需要{},如果格式字符串以文本开头,则不需要。例如:“ {} {0} + {1}”“ {1}的第{0}页”
Dakianth,2016年

它不适用于WPF项目.Net 4.0 Visual Studio2017。–
Sorush

@Patrick的解决方案为我工作。我无法使它正常工作。我遇到了此错误XamlParseException: A 'Binding' cannot be set on the 'Path' property of type 'Binding'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
泰森·威廉姆斯

127

我知道这很晚了,但我想我会添加另一种方式。

您可以利用以下事实:可以使用“ Run s” 来设置Text属性,因此您可以使用Run为每个绑定设置多个绑定。如果您无权访问MultiBinding(在为Windows Phone开发时找不到),这将很有用。

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

4
当绑定到作为DynamicResource来源的多个字符串时,这是一种非常方便的方法,因为您不能为此使用带有StringFormat的MultiBinding。
slugster 2013年

我刚试过 它可以工作,但是由于某种原因,绘制(刷新)的每个元素(甚至是几何图形)现在每次闪烁时都会闪烁。要尝试其他方法。
Logan Klenner 2014年

6
如果必须对文本进行本地化,这会变得很困难,因为该顺序是硬编码的。
BlueM

1
这种方法的另一种用法是对每个绑定应用不同的样式
Hamid Naeemi


23

如果这些只是文本块(因此是一种单向绑定),而您只想串联值,则只需绑定两个文本块并将它们放在水平堆栈面板中即可。

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

这将显示文本(这是所有Textblock所做的),而无需执行任何其他编码。您可能会给它们留一点利润,以使它们看起来正确。


11

使用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}}" />

是的-这是6年前写的,您将“名称”作为第一个参数绑定到转换器(在代码中称为值),并将ID(问题中的字符串)绑定为第二个参数。
Preet Sangha
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.