imani-cの日記

WPFスタイルとテンプレートの本をAmazonで出しました。ちょっととっつきにくいこれらについて知りたいお方は、覗いてみてください。「WPF スタイル」で検索すると、トップに出ます。gRPCの本もあります。「gRPC入門」で検索するとすぐ見つかります。

Binding.StringFormat

TextBlock.Textに文字列以外をバインドすると、文字列に変換してから表示されます。文字列への変換にはバインド先オブジェクトのToString()が使われますが、書式を指定することもできます。

<TextBlock Text="{Binding CurrentTime}"/>
<TextBlock Text="{Binding CurrentTime, StringFormat=Current time \= {0:MM/dd}}"/>

f:id:imani-c:20220412111029p:plain
StringFormatの有無による違い

目次

書式指定方法

double型のプロパティを表示するTextBlockを例にとって説明します。 ここで、バインド先であるDoubleValueプロパティの値を1.234とします。

<TextBlock Text="{Binding DoubleValue, StringFormat=Value \= {0:E}}"/>

上記の例では、doubleの値を指数表記で表示しています。StringFormatの各部の意味は、以下の通りです。

書式 意味
Value \= このまま表示されます。(メモ1)
{ 数値表示の始まりです。
0: 最初のバインド先を表示するよう指定します。(メモ2)
E 数値を指数表記するよう指定します。
} 数値表示の終わりです。
  • メモ1:「=」のようにXamlがほかの意味で解釈する文字にはエスケープ文字「\」を先行させます。
  • メモ2:バインド先が一つしかないBindingでは、常に0を指定します。2個以上のバインド先を持つMultiBindingではバインド先に応じた値を指定します。

「E」のような表記指定方法を標準の数値書式指定文字列と呼びます。標準の書式指定文字列には、以下のものがあります。

詳しくは上記のリンク先を見てください。

標準の数値書式指定文字列では思った表示が得られないことがあります。その場合には、カスタム数値書式形式文字列を使えます。 以下の例は、小数点以下を2桁で表示するよう指定しています。

<TextBlock Text="{Binding DoubleValue, StringFormat={}{0:0.00}}"/>

f:id:imani-c:20220412111027p:plain
カスタム数値形式
書式文字列に「{}」という表記があります。これは、Xamlパーサーの誤解釈を防ぐためのものです。 この例のように書式文字列が「{」で始まるときには、これを置かなければなりません。

カスタム形式文字列の書き方には、以下のものがあります。

詳しくは上記のリンク先を見てください。

複数個所で同じ書式を使うにはリソースに定義する

アプリケーション全体を通してプロジェクトで定められた書式で数値を表示することは、普通にあることです。そのような時に都度StringFormatにその書式を書いていると、ミスが増えますし、仕様変更時にも大変なことになります。 そのような時には、書式をリソースとして定義しましょう。

<StackPanel.Resources>
    <system:String x:Key="DoubleFormatString">Value is {0:0.00}</system:String>
</StackPanel.Resources>
<TextBlock Text="{Binding DoubleValue, StringFormat={StaticResource DoubleFormatString}}" FontSize="20"/>

f:id:imani-c:20220412111031p:plain
リソースによる書式供給
リソースとして定義した書式をプロジェクト共通、あるいは、ソリューション共通のリソースにすると、アプリケーション全体で統一した書式を容易に利用できます。