最初に注意することはこれです:
HeaderedContentControlのHeaderTemplateまたはHeaderTemplateSelectorプロパティを設定した場合、HeaderStringFormatプロパティは無視されます。
MSDN
WPFには、このような注意すべき落とし穴がかなりあります。あなたの例ではそれを示していませんが、それを覚えておいてください。しかし、これはあなたの問題ではないと思います。
2つ目の注意点は、これは次のものと同じではないということです。
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はこの方法でバインドされず、代わりに、HeaderedItemsControlのItemContainerによって提供されるデフォルトのバインドになります。たとえば、TabItemのItemsSourceプロパティを設定すると、ヘッダーとコンテンツバインディングが自動的に接続され、必要なフォーマット値を指定するだけで済みます。
最後になりましたが、GroupBoxとTabItemを使用してすべてを適切に機能させることができましたが、エキスパンダーを使用した場合はそれほど幸運ではなく、理由はわかりません。エキスパンダーはContentStringFormatを適切に処理しますが、HeaderContentStringFormatは処理しません。両方がHeaderContentControlから継承していることを考えると、これは驚くべきことです。