閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

MenuItem.Headerに対してStringFormatが効かない

<MenuItem Header="{Binding Value, StringFormat={}{0}円}"/>

みたいに書いてもStringFormatの部分が無視されてしまう。ググって見ると WPF binding with StringFormat doesn't work on ToolTips - Stack Overflow がヒットして、もしやと見てみたらMenuItemにもHeaderStringFormatプロパティがあってこちらを使うと良いらしい(検索する前にドキュメントを見ろという話)。

<MenuItem Header="{Binding Value}" HeaderStringFormat="{}{0}円"/>

MenuItem(実際はHeaderedItemsControl).Headerはobject型なので、Binding.StringFormatは機能しないんですね。TextBlock.Textなどはstring型なので動作するみたい。…ってこと自体すでにドキュメントに書かれているし。

Gets or sets a string that specifies how to format the binding if it displays the bound value as a string.

https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.data.bindingbase.stringformat?view=netframework-4.7.2

内部的にはItemsControlがHeaderとHeaderStringFormatをDisplayMemberTemplateSelectorに渡してこれがTextBlockを子に入れ込んでいる感じなんですかね。