【问题标题】:How to bind multiple values to a single WPF TextBlock?如何将多个值绑定到单个 WPF TextBlock?
【发布时间】:2011-02-02 21:59:18
【问题描述】:

我目前正在使用下面的TextBlock 来绑定名为Name 的属性的值:

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

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

是否可以将两个或多个值绑定到同一个TextBlock?可以通过简单的连接来完成,比如Name + ID,如果不能,还有什么方法可以解决?

【问题讨论】:

    标签: wpf data-binding binding textblock multibinding


    【解决方案1】:

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

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

    Name 一个值FooID 一个值1,那么您在TextBlock 中的输出将是Foo + 1

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

    【讨论】:

    • @Preet - 实际上我不确定在这种情况下是否需要使用“{}”,因为它在 MSDN 示例中使用过,所以我将其包括在内。然而,一般来说,它需要作为 XAML 解析器的转义序列以避免与 Binding 标记扩展混淆。
    • 这有一个副作用。如果您在 DataGrid 之类的东西中使用此方法,不幸的是,排序行为不起作用。更合适的解决方案是在模型中创建一个只读属性,并使用适当的字符串格式进行绑定。不用说,这是一种快速格式化的好方法,尽管有点冗长。
    • 格式字符串以参数{0}开头时只需要{},如果格式字符串以文本开头则不需要。例如:“{}{0} + {1}”“第 {0} 页,共 {1} 页”
    • 它不适用于 WPF 项目 .Net 4.0 Visual Studio 2017。
    • @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.
    【解决方案2】:

    我知道这有点晚了,但我想我应该添加另一种方法。

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

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

    【讨论】:

    • 当绑定到作为 DynamicResource 来源的多个字符串时,这是一种非常方便的方法,因为您不能为此使用带有 StringFormat 的 MultiBinding。
    • 我刚试过这个。它可以工作,但是(刷新时)绘制的每个元素(甚至几何图形)现在由于某种原因在每个刻度上闪烁。打算试试其他方法。
    • 如果文本必须本地化,因为订单是硬编码的,这会变得很困难。
    • 这种方法的另一种用法是为每个绑定应用不同的样式
    • 这对我有用,虽然有一个变化。我必须将Mode=OneWay 添加到我的绑定中。也许这是我使用不可变数据类型所特有的东西。
    【解决方案3】:

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

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

    这将显示文本(这是所有 Textblocks 所做的),而无需进行任何更多的编码。不过,您可以在它们上加一点边距以使它们看起来正确。

    【讨论】:

      【解决方案4】:

      使用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(来自问题的字符串) 作为第二个参数。
      猜你喜欢
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多