StringFormatを使用してWPF XAMLバインディングに文字列を追加する


124

整数値(この場合は摂氏での温度)への一方向のバインディングを持つTextBlockを含むWPF 4アプリケーションがあります。XAMLは次のようになります。

<TextBlock x:Name="textBlockTemperature">
        <Run Text="{Binding CelsiusTemp, Mode=OneWay}"/></TextBlock>

これは実際の温度値を表示するのには問題なく機能しますが、数値ではなく°C(30ではなく30°C)が含まれるようにこの値をフォーマットしたいと思います。私はStringFormatについて読んでいて、次のようないくつかの一般的な例を見てきました。

// format the bound value as a currency
<TextBlock Text="{Binding Amount, StringFormat={}{0:C}}" />

そして

// preface the bound value with a string and format it as a currency
<TextBlock Text="{Binding Amount, StringFormat=Amount: {0:C}}"/>

残念ながら、私が見た例では、私がしようとしているように、バインドされた値に文字列を追加していません。シンプルなものに違いないと思いますが、うまくいきません。誰でもそれを行う方法を私に説明できますか?

回答:


217

最初の例は、効果的に必要なものです。

<TextBlock Text="{Binding CelsiusTemp, StringFormat={}{0}°C}" />

20
xamlの文字列形式の先頭に何もないのはなぜ{}ですか?
ジョネソポリス

6
@Jonesopolisこれはドキュメントにありますが、フォーマット文字列がで始まる場合は、すでにxamlで意味がある{ため、エスケープするメカニズムを提供{}します。
リードコプシー2016

5
ドキュメントが先頭の{}を説明している場所がわかりません。
エリック

5
@Eric多くのドキュメントと同様に、臭いです-彼らはそれをデモしますが、説明しません。
リードコプシー2016年

19
ここで謎の{}のドキュメント:msdn.microsoft.com/en-us/library/ms744986.aspx
Jotrius

106

文字列または複数のバインディングの途中にBindingがある場合に、読みやすくするための代替案を次に示します。

<TextBlock>
  <Run Text="Temperature is "/>
  <Run Text="{Binding CelsiusTemp}"/>
  <Run Text="°C"/>  
</TextBlock>

<!-- displays: 0°C (32°F)-->
<TextBlock>
  <Run Text="{Binding CelsiusTemp}"/>
  <Run Text="°C"/>
  <Run Text=" ("/>
  <Run Text="{Binding Fahrenheit}"/>
  <Run Text="°F)"/>
</TextBlock>

6
文字列ライブラリからテキストを簡単に挿入できるので、この答えが少し好きです。もちろん、国際化について本当に心配しているのであれば、おそらくコンバータを使用した方がいいので、数と単位の順序は固定されていません。<Run Text = "{x:Static s:UIStrings.General_FahrenheitAbbreviation}" />
Matt Becker

1
これは素晴らしい解決策ですが、テキストランの間の最終的なテキスト表示に余分なスペースができます-なぜですか?あなたの例で私が見る0 °C ( 32 °F)
コンラッド

実際の文字列フォーマットを行う場合(つまり、小数点以下の桁数を制御する場合など)は、あまり役に立ちません。
BrainSlugs83 16

5
@Conrad各実行の間にスペースを入れたくない場合は、次のようにそれらの実行を1行に配置する必要があります。<TextBlock> <Run Text = "{Binding CelsiusTemp}" /> <Run Text = "°C" / > <Run Text = "(" /:<Run Text = "{Binding Fahrenheit}" /> <Run Text = "°F)" /> </ TextBlock>
Ladislav Ondris 2017

92

BindingsでのStringFormatの使用は、「テキスト」プロパティに対してのみ機能するようです。これをLabel.Contentに使用すると機能しません


15
非常に私は絶望的だし、私の疑惑を検証するために、このコメントを見つけるまでかかった重要な点は、私はそれをしようとしています。
DonBoitnott 2017

64
ContentStringFormat救助に来る、例:Content="{Binding Path=TargetProjects.Count}" ContentStringFormat="Projects: {0}"
アストロウォーカー2017年

2
その情報を投稿してくれた本物のヒーロー、キャスパーに感謝します。
DaWiseguy

5
GridViewColumnヘッダーには、使用HeaderStringFormat="{}{0} For Report"
Felix

2
デザインタイムデータを使用している場合、ContentStringFormatを編集した後にプロジェクトを再構築して変更をデザイナーに反映させる必要があるようですが、たとえば、テキストボックスを使用すると、テキストボックスはデザイナーをリアルタイムで更新します。
Richard Moore

-8

XAMLで

<TextBlock Text="{Binding CelsiusTemp}" />

ではViewModel、この方法で値を設定することもできます。

 public string CelsiusTemp
        {
            get { return string.Format("{0}°C", _CelsiusTemp); }
            set
            {
                value = value.Replace("°C", "");
              _CelsiusTemp = value;
            }
        }

19
これは、ビューとビューモデルの分離という全体の要点に反します
Askolein 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.