2010-03-31 41 views
146

我目前使用下面的TextBlock到名为Name属性的值绑定:如何将多个值绑定到单个WPF TextBlock?

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

现在,我要绑定命名ID到同一TextBlock另一财产。

是否有可能将两个或更多值绑定到相同的TextBlock?它可以通过简单的连接完成,如Name + ID,如果没有,还可以如何接近?

回答

323

您可以使用MultiBindingStringFormat性能相结合。用法将类似于以下:

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

鉴于Foo名称的价值和为1 ID的价值,你在TextBlock的输出会Foo + 1

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

+6

不同的是格式中的{}有什么作用? – 2010-03-31 14:26:00

+5

@Preet - 我实际上并不确定在这种情况下是否需要'{}',因为它是在MSDN示例中使用的,所以我将它包含在内。但是,一般来说,XAML解析器需要作为转义序列来避免与绑定标记扩展混淆。 – 2010-03-31 14:46:06

+1

这有一个副作用。如果你像'DataGrid'这样的排序行为使用这种方法不幸的是不起作用。更合适的解决方案是在模型中创建一个只读属性,并使用适当的字符串格式进行绑定。不用说,这是一种快速格式化的简单方法,尽管有点冗长。 – 2011-06-18 21:53:16

9

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

这是行不通的吗?你在哪里绑定到ID? – waxingsatirical 2016-05-26 09:48:24

+0

是的 - 这是6年前编写的,而且您将“Name”作为第一个参数绑定到转换器(在代码中称为值),并将ID(来自问题的字符串)作为第二个参数。 – 2016-05-28 23:15:11

16

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

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

这将无需做任何更多的编码显示的文本(这是所有的TextBlocks做)。你可能会在他们身上留下一点空白,让他们看起来不错。

98

我知道这是一种很晚的方式,但我想我会添加另一种方式来做到这一点。

您可以利用Text属性可以使用“Run s”设置的事实,因此您可以使用每个Run的Run来设置多个绑定。如果您无法访问MultiBinding(在Windows Phone上进行开发时未找到该选项),这很有用

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

这是一种非常方便的方法,可用于绑定多个源为DynamicResource的字符串不要使用带有StringFormat的MultiBinding。 – slugster 2013-06-04 23:59:11

+6

只适用于.NET 4.0+ – Doug 2013-06-24 00:46:08

+0

我刚试过这个。它可以工作,但是每一个得到绘制的元素(甚至是几何图形)都会因为某种原因而闪烁。去尝试另一种方法。 – 2014-09-17 03:48:01