Первое, что нужно отметить, это:
Если вы установите HeaderTemplate или HeaderTemplateSelector свойство HeaderedContentControl свойство HeaderStringFormat является игнорируется. MSDN
Есть немало подводных камней, как это в WPF, чтобы не упустить. Вы не показали этого в своем примере, но просто помните об этом. Однако, я не думаю, что это твоя проблема.
Второе, что следует отметить, что это не то же самое, как:
String.Format("My string value is: {0}", myValue");
HeaderedContentControl и HeaderStringFormat используются специально для классов, реализующих IFormattable. HederStringFormat форматирует заголовок, а ContentStringFormat форматирует содержимое. Значение любого свойства - это формат, который передается в реализацию вашего класса, если IFormattable.ToString. Вы можете прочитать полный пример на MSDN. Но вот суть того, как заставить его работать.
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>
Это TabItem теперь будет отображаться «Это моя отформатированный строка» в заголовке, и содержание будет «это мой не отформатированные строки».
Есть пара вещей, о которых следует помнить. Обычно эти свойства будут использоваться только в контексте HeaderedItemsControl. HeaderStringFormat не будет связан таким образом и вместо этого будет иметь привязку по умолчанию, предоставленную ItemContainer HeaderedItemsControl. Например, если вы установите свойство ItemsSource для TabItem, он автоматически подключит заголовок и привязку содержимого для вас, и все, что вам нужно сделать, это предоставить нужное значение форматирования.
Последнее, но не менее важное: я смог получить все, что работает нормально с GroupBox и TabItem, но не так много удачи с расширителем, и я не уверен, почему. Расширитель правильно обрабатывает ContentStringFormat, но не HeaderContentStringFormat. Это удивительно, учитывая, что оба наследуются от HeaderContentControl.