1. ホーム
  2. wpf

[解決済み] WPF StringFormat on Label Content (ラベルコンテンツにおける StringFormat)

2023-04-06 20:59:15

質問

文字列結合を Amount is X ここで X はラベルにバインドされたプロパティです。

多くの例を見てきましたが、以下はうまくいきません。

<Label Content="{Binding Path=MaxLevelofInvestment, 
   StringFormat='Amount is {0}'}" />

こんな組み合わせも試してみました。

StringFormat=Amount is {0}
StringFormat='Amount is {}{0}'
StringFormat='Amount is \{0\}'

さらに、バインディングプロパティのデータ型を int , stringdouble . 何も動作しないようです。これは非常に一般的な使用例ですが、サポートされていないようです。

どのように解決するのですか?

これがうまくいかない原因は Label.Content プロパティが Object で、かつ Binding.StringFormat のプロパティにバインドするときのみ使用されます。 String .

何が起きているかというと

  1. Binding は、あなたの MaxLevelOfInvestment の値をボックス化し、それを Label.Content プロパティにボックス化された10進数値として格納します。
  2. Labelコントロールは、テンプレートに ContentPresenter .
  3. から ContentTemplate が設定されていない。 ContentPresenter を探します。 DataTemplate に対して定義された Decimal 型に定義されています。 それがない場合、デフォルトのテンプレートが使用されます。
  4. が使用するデフォルトのテンプレートは ContentPresenter は、ラベルの ContentStringFormat プロパティを使って文字列を表示します。

2つの解決策が考えられます。

  • Binding.StringFormatの代わりにLabel.ContentStringFormatを使う、または
  • Label.Contentの代わりにTextBlock.TextのようなStringプロパティを使用します。

Label.ContentStringFormatの使い方を説明します。

<Label Content="{Binding Path=MaxLevelofInvestment}" ContentStringFormat="Amount is {0}" />

TextBlockの使い方を説明します。

<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is {0}'}" />

注:上記の説明では、わかりやすくするために、1つの詳細を省略しました。 それは ContentPresenter は実際にはそれ自身の TemplateStringFormat プロパティがありますが、ロード中にこれらは自動的にテンプレートバインドされます。 ContentTemplateContentStringFormat のプロパティは Label のように見えるので、あたかも ContentPresenter が実際に使っているのは Label のプロパティを使用しています。