2008-11-16 3 views
11

Ich kann nicht scheinen, die magische Kombination zu finden, um das HeaderStringFormat für einen WPF Expander funktionieren zu lassen.WPF - HeaderStringFormat Funktioniert nicht in Expander

Hier sind alle Dinge, die ich versucht habe:

<Expander Header="{Binding Path=MyProperty, StringFormat=Stuff: ({0})}" > 
    <TextBlock Text="Some Content" /> 
</Expander> 
<Expander HeaderStringFormat="{}Stuff ({0})" Header="{Binding Path=MyProperty}"> 
    <TextBlock Text="Some More Content" /> 
</Expander> 
<Expander HeaderStringFormat="{}Stuff ({0:0})" Header="{Binding Path=MyProperty}"> 
    <TextBlock Text="Even More Content" /> 
</Expander> 

Die einzige Art, wie ich eine formatierte Zeichenfolge bekommen kann richtig in meinem Code zu arbeiten, dies zu tun:

<Expander> 
    <Expander.Header> 
     <TextBlock Text="{Binding Path=MyProperty, StringFormat=Stuff: ({0})}" /> 
    </Expander.Header> 
    <Expander.Content> 
     A Expander with working header 
    </Expander.Content> 
</Expander> 

Was ist Ich mache falsch?

Antwort

10

Das erste, was zu beachten ist folgendes:

Wenn Sie die Header oder HeaderTemplateSelector Eigenschaft eines HeaderedContentControl gesetzt, die Header Eigenschaft ist ignoriert. MSDN

Es gibt durchaus ein paar gotchas wie dies in WPF zu achten. Das hast du in deinem Beispiel nicht gezeigt, aber behalte es im Hinterkopf. Ich glaube jedoch nicht, dass dies dein Problem ist.

Zweitens, was zu beachten ist, dass dies nicht das Gleiche wie:

String.Format("My string value is: {0}", myValue"); 

HeaderedContentControl und Header sind speziell für die Klassen verwendet, die IFormattable implementieren. HederStringFormat formatiert den Header und ContentStringFormat formatiert den Inhalt. Der Wert einer der beiden Eigenschaften ist das Format, das bei IFormattable.ToString an die Klassenimplementierung übergeben wird. Sie können das vollständige Beispiel auf MSDN lesen. Aber hier ist der Kern, wie man es zum Laufen bringt.

public class MyTestClass : IFormattable 
{ 
    #region IFormattable Members 
    public string ToString(string format, IFormatProvider formatProvider) 
    { 
     if(format == "n") 
     { 
      return "This is my formatted string"; 
     } 
     else 
     { 
      return "this is my non-formatted string"; 
     } 
    } 
    #endregion 
} 

    <Style TargetType="{x:Type TabItem}"> 
     <Setter Property="HeaderStringFormat" Value="n" /> 
     <Setter Property="ContentStringFormat" Value="" /> 
    </Style> 

<TabControl> 
    <TabItem Header="{Binding Content, RelativeSource={RelativeSource Self}}"> 
     <local:MyTestClass /> 
    </TabItem> 
</TabControl> 

Dieses TabItem wird nun angezeigt: „Das ist mein formatierten String“ in der Kopfzeile und der Inhalt wird „dies ist mein nicht-formatierten String“.

Es gibt ein paar Dinge zu beachten. In der Regel werden diese Eigenschaften nur in einem HeaderedItemsControl-Kontext verwendet. Das HeaderStringFormat wäre nicht auf diese Weise gebunden und stattdessen die Standardbindung, die von ItemContainer des HeaderedItemsControl bereitgestellt wird. Wenn Sie beispielsweise die ItemsSource-Eigenschaft des TabItems festlegen, werden automatisch die Header- und die Inhaltsbindung für Sie verknüpft, und Sie müssen lediglich den gewünschten Formatierungswert angeben.

Last, but not least konnte ich alles richtig mit einer GroupBox und TabItem arbeiten, aber nicht so viel Glück mit einem Expander und ich bin mir nicht sicher warum. Der Expander behandelt das ContentStringFormat ordnungsgemäß, aber nicht das HeaderContentStringFormat. Dies ist überraschend, wenn man bedenkt, dass beide von HeaderContentControl erben.