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

Spe*_*n D 191 data-binding wpf binding textblock multibinding

我目前正在使用TextBlock以下命令绑定名为的属性的值Name:

<TextBlock Text="{Binding Name}" />
Run Code Online (Sandbox Code Playgroud)

现在,我想绑定另一个名为ID相同的属性TextBlock.

是否可以将两个或多个值绑定到同一个值TextBlock?是否可以通过简单的连接来完成Name + ID,如果没有,可以如何处理它?

Ric*_*ire 406

您可以MultiBinding结合使用该StringFormat物业.用法类似于以下内容:

<TextBlock>
    <TextBlock.Text>    
        <MultiBinding StringFormat="{}{0} + {1}">
            <Binding Path="Name" />
            <Binding Path="ID" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)

给定Name的Foo值和1TextBlock中输出的ID的值将是Foo + 1.

Note: 这仅在.NET 3.5 SP1和3.0 SP2或更高版本中受支持.

  • 当格式字符串以参数{0}开头时,您只需要{},如果格式字符串以文本开头,则不需要{}.例如:"{} {0} + {1}""{1}的页面{0}" (33认同)
  • 这个格式中的{}是什么? (6认同)
  • @Preet - 我实际上不确定在这种情况下是否需要'{}',因为它是在MSDN示例中使用的,所以我将其包括在内.但是,通常需要将其作为XAML解析器的转义序列,以避免与Binding标记扩展混淆. (5认同)
  • 对此有一个副作用.如果你在像`DataGrid`这样的东西中使用这种方法,那么遗憾的是它不起作用.更合适的解决方案是在模型中创建一个只读属性,并使用适当的字符串格式进行绑定.毋庸置疑,这是一种快速格式化的简洁方法,尽管有点冗长. (2认同)
  • 它不适用于 WPF 项目 .Net 4.0 Visual Studio 2017。 (2认同)
  • @Patrick 的解决方案对我有用。我无法让它发挥作用。我遇到了此错误“XamlParseException:无法在“Binding”类型的“Path”属性上设置“Binding”。“绑定”只能在 DependencyObject 的 DependencyProperty 上设置。 (2认同)

Pat*_*ick 122

我知道这是一个迟到的方式,但我想我还会添加另一种方法.

您可以利用可以使用" Run s" 设置Text属性的事实,因此您可以使用Run为每个绑定设置多个绑定.如果您无法访问MultiBinding(我在开发Windows Phone时没有找到),这非常有用

<TextBlock>
  <Run Text="Name = "/>
  <Run Text="{Binding Name}"/>
  <Run Text=", Id ="/>
  <Run Text="{Binding Id}"/>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)

  • 如果必须对文本进行本地化,这可能会变得困难,因为订单是硬编码的. (6认同)
  • 这是一种非常方便的方法,在绑定到几个源自DynamicResource的字符串时使用,因为你不能使用带有StringFormat的MultiBinding. (4认同)

Cod*_*ior 22

如果这些只是文本块(因此单向绑定),并且您只想连接值,只需绑定两个文本块并将它们放在水平堆栈面板中.

    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Name}"/>
        <TextBlock Text="{Binding ID}"/>
    </StackPanel>
Run Code Online (Sandbox Code Playgroud)

这将显示文本(这是所有Textblocks所做的),而不必再进行任何编码.你可能会在它们上留一小部分让它们看起来正确.


Pre*_*gha 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并在标记中

<src:MyConverter x:Key="MyConverter"/>
Run Code Online (Sandbox Code Playgroud)

...

<TextBlock Text="{Binding Name, Converter={StaticResource MyConverter Parameter=ID}}" />
Run Code Online (Sandbox Code Playgroud)