2009-02-12 8 views
67

Ich möchte eine Liste der Customer-Objekte in einem WPF ItemsControl anzeigen. Ich habe eine Datatemplate für diesen erstellt:Verketten von Zeichenfolgen anstelle eines Stapels von 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> 

Also, was ich will, ist im Grunde eine einfache Liste (mit Kontrollkästchen), die NUMBER enthält - Namen. Gibt es nicht eine Möglichkeit, die Nummer und den Namen direkt in den Binding-Teil einzutragen?

Antwort

140

Es gibt StringFormat-Eigenschaft (in .NET 3.5 SP1), die Sie wahrscheinlich verwenden können. Und nützliche WPF bindende Cheat Sheat kann here gefunden werden. Wenn es nicht hilft, können Sie immer Ihren eigenen ValueConverter oder eine benutzerdefinierte Eigenschaft für Ihr Objekt schreiben.

Nur überprüft, können Sie StringFormat mit Multibinding verwenden. In Ihrem Fall wird Code so etwas wie diese:

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

Ich hatte Format-String mit Platz zu starten, sonst Visual Studio würde nicht bauen, aber ich glaube, Sie Weg, um es zu bekommen finden :)

Bearbeiten
Der Platz wird in dem StringFormat benötigt, um den Parser davon abzuhalten, {0} als eine tatsächliche Bindung zu behandeln. Andere Alternativen:

<!-- 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

Anstelle des Platzes können Sie {}, z. StringFormat = "{} {0} - {1}" –

+0

Danke, wusste das nicht! :) – PiRX

+0

Das ist hilfreiches Zeug, danke für alles! –

3

Sie können auch einen binären Lauf verwenden. Nützliche Dinge, vor allem, wenn man Textformatierungen (Farben, Schriftarten usw.) hinzufügen möchte.

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

Here's ein Original-Klasse:
Here sind einige zusätzliche Verbesserungen.
Und das ist alles in einem Stück Code:

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

Falls Sie einen dynamischen Wert mit einem statischen Text verketten wollen, versuchen Sie dies:

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

Displays: 234-334- 5566 (SSN)

+1

Was ist der Inhalt von TextBlockLeftStyle? – itsho

+0

Es ist ein benutzerdefinierter Stil, den ich den Textblock nach links ausrichten muss. Es hat hier keine Bedeutung. – redskull

7

Siehe das folgende Beispiel, das ich in meinem Code verwenden Run-Klasse:

 <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 > 
Verwandte Themen