2009-02-12 92 views
67

我想在WPF ItemsControl中顯示Customer對象的列表。我創建了一個DataTemplate此:連接字符串而不是使用一堆TextBlocks

<DataTemplate DataType="{x:Type myNameSpace:Customer}"> 
     <StackPanel Orientation="Horizontal" Margin="10"> 
      <CheckBox"></CheckBox> 
      <TextBlock Text="{Binding Path=Number}"></TextBlock> 
      <TextBlock Text=" - "></TextBlock> 
      <TextBlock Text="{Binding Path=Name}"></TextBlock> 
     </StackPanel> 
    </DataTemplate> 

所以,我想基本上是一個簡單的列表(帶複選框),其中包含號碼 - 名稱。沒有一種方法可以在綁定部分中直接連接數字和名稱?

回答

140

有可能使用的StringFormat屬性(在.NET 3.5 SP1中)。並且有用的WPF綁定作弊sheat可以找到here。 如果它沒有幫助,你可以爲你的對象編寫你自己的ValueConverter或自定義屬性。

剛剛檢查過,你可以使用StringFormat和multibinding。你的情況的代碼將是這樣的:

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

我不得不開始格式化字符串的空間,否則的Visual Studio不會建造,我想你會發現方式繞過它:)

編輯
StringFormat中需要空格,以防止解析器將{0}視爲實際綁定。其他選擇:

<!-- use a space before the first format --> 
<MultiBinding StringFormat=" {0} - {1}"> 

<!-- escape the formats --> 
<MultiBinding StringFormat="\{0\} - \{1\}"> 

<!-- use {} before the first format --> 
<MultiBinding StringFormat="{}{0} - {1}"> 
+24

而不是您可以使用的空間{} StringFormat =「{} {0} - {1}」 – 2009-02-12 19:11:23

+0

謝謝,不知道! :) – PiRX 2009-02-12 19:54:36

3

您還可以使用可綁定運行。有用的東西,尤其是如果你想添加一些文本格式(顏色,fontweight等)。

<TextBlock> 
    <something:BindableRun BoundText="{Binding Number}"/> 
    <Run Text=" - "/> 
    <something:BindableRun BoundText="{Binding Name}"/> 
</TextBlock> 

Here's一個原始類:
Here有一些額外的改進。
而這一切,在一個代碼片段:

public class BindableRun : Run 
    { 
     public static readonly DependencyProperty BoundTextProperty = DependencyProperty.Register("BoundText", typeof(string), typeof(BindableRun), new PropertyMetadata(new PropertyChangedCallback(BindableRun.onBoundTextChanged))); 

     private static void onBoundTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      ((Run)d).Text = (string)e.NewValue; 
     } 

     public String BoundText 
     { 
      get { return (string)GetValue(BoundTextProperty); } 
      set { SetValue(BoundTextProperty, value); } 
     } 

     public BindableRun() 
      : base() 
     { 
      Binding b = new Binding("DataContext"); 
      b.RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(FrameworkElement), 1); 
      this.SetBinding(DataContextProperty, b); 
     } 
    } 
36

如果你想與Concat的一個靜態文本動態值,試試這個:

<TextBlock Text="{Binding IndividualSSN, StringFormat= '\{0\} (SSN)'}"/> 

顯示:234-334- 5566(SSN)

7

請參見下面的例子中,我在我的代碼使用運行類使用:

 <TextBlock x:Name="..." Width="..." Height="..." 
      <Run Text="Area="/> 
      <Run Text="{Binding ...}"/> 
      <Run Text="sq.mm"/> 
      <LineBreak/> 
      <Run Text="Min Diameter="/> 
      <Run Text="{Binding...}"/> 
      <LineBreak/> 
      <Run Text="Max Diameter="/> 
      <Run Text="{Binding...}"/> 
     </TextBlock >