Pierwszą rzeczą, aby pamiętać, to:
Jeśli ustawisz HeaderTemplate lub własność HeaderTemplateSelector o HeaderedContentControl właściwość HeaderStringFormat jest ignorowane. MSDN
Istnieje sporo pułapek, jak to w WPF na które trzeba uważać. Nie pokazałeś tego na swoim przykładzie, ale miej to na uwadze. Jednak nie sądzę, że to twój problem.
Drugą rzeczą jest, aby pamiętać, że to nie jest takie samo jak:
String.Format("My string value is: {0}", myValue");
HeaderedContentControl i HeaderStringFormat stosowane są specjalnie dla klas, które implementują IFormattable. HederStringFormat formatuje nagłówek, a ContentStringFormat formatuje treść. Wartością każdej z właściwości jest format przekazywany do implementacji klas, jeśli IFormattable.ToString. Pełny przykład można przeczytać na stronie MSDN. Ale oto, jak sprawić, by działało.
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>
Ten TabItem będzie teraz wyświetlać „To jest moje sformatowany ciąg” w nagłówku, a zawartość będzie „to mój non-sformatowany ciąg”.
Jest kilka rzeczy, o których należy pamiętać. Zazwyczaj te właściwości będą używane tylko w kontekście HeaderedItemsControl. HeaderStringFormat nie byłby związany w ten sposób, a zamiast tego będzie miał domyślne powiązanie dostarczone przez ItemContainer z HeaderedItemsControl. Na przykład, jeśli ustawisz właściwość ItemsSource elementu TabItem, to automatycznie połączy on nagłówek i powiązanie zawartości, a wszystko, co musisz zrobić, to podać żądaną wartość formatowania.
Ostatni, ale nie mniej ważny, udało mi się uzyskać wszystko działa poprawnie z GroupBox i TabItem, ale nie tak dużo szczęścia z ekspanderem i nie jestem pewien dlaczego. Ekspander obsługuje poprawnie ContentStringFormat, ale nie HeaderContentStringFormat. Jest to zaskakujące, biorąc pod uwagę, że oba dziedziczą z HeaderContentControl.