webdevqa.jp.net

String.Formatに相当するWPFXAMLデータバインディングとは何ですか?

または、より明確にするために、テキストの一部がバインドされた値から来るように、テキストのブロック(私の場合はツールチップに含まれる)をフォーマットするにはどうすればよいですか?.

プレーンなC#では、次のものを使用します。

_toolTip.Text = string.Format("{1:#0}% up, {2:#0}% down",
    Environment.NewLine, percentageOne, percentage2);

ただし、TextプロパティのWPF XAMLマークアップには、単一のバインディングしか含めることができないようです。中括弧は私に高い希望を与えましたが、これは不可能です:

<Element>
  <Element.Tooltip>
    <!-- This won't compile -->
    <TextBlock Text="{Binding Path=PercentageOne}% up, {Binding Path=PercentageTwo}% down"/>
  </Element.Tooltip>
</Element>

私はそれを読んだRun.Textプロパティは依存関係プロパティではないため、バインドできません。

XAMLでこのフォーマットを実行する方法はありますか?

31
Drew Noakes

MultiBinding + StringFormatを使用できます(WPF 3.5 SP1が必要です)。

<TextBox.Text>
    <MultiBinding StringFormat="{}{1:#0}% up, {2:#0}% down">
      <Binding Path="PercentageOne" />
      <Binding Path="PercentageTwo"/>
    </MultiBinding>
</TextBox.Text>

Run.Textについて-バインドすることはできませんが、いくつかの回避策があります。

45
aku

複数のテキストブロックに分割し、それぞれをStringFormat = {0:P}でバインドします。

<TextBox Text="{Binding Something, StringFormat=\{0:P\}}" />

例については、この投稿を参照してください: StringFormatに関するLesterのWPFブログ

チェックアウトVS2010-プロパティからのバインドには、オプションのフォーマットが含まれます。

11
Dave

3.5 SP1を使用している場合は、Akuの答えが最適です。そうでない場合は、私の WPF Converters ライブラリの FormatConverter を使用できます。

3
Kent Boogaart

私の知る限り、WPFはあなたが望むことをしません。あなたははるかに強力な(より複雑ではありますが)解決策を持っています。

IValueConverter インターフェースを見てください。

MSDNハウツーリンク ここ

[〜#〜]編集[〜#〜]

Akuの回答と、3.5 SP1を使用できないというあなたの主張に基づいて、ここに代替案があります。

文字列のフォーマットに関するPhilHaackの最近の一連の投稿をご覧ください。

フォーマットをプロパティとして使用するValueConverterを作成します。これで、データオブジェクトをバインドし、定義した形式に基づいた形式にすることができます(位置の代わりにプロパティ名を使用)。

2
Michael Meadows

私が過去にこれを解決した方法は、実際には、リストにあるTextBlockをいくつかのTextBlockに分割することです。次のようなものを試してください。

<Element>
  <Element.Tooltip>
    <StackPanel Orientation="Horizontal">
      <TextBlock Text="{Binding Path=PercentageOne}"/>
      <TextBlock Text="% up, "/>
      <TextBlock Text="{Binding Path=PercentageTwo}"/>
      <TextBlock Text="% down"/>
    </StackPanel>
  </Element.Tooltip>
</Element>

または、StringFormatConverterのようなものを作成して、フォーマット文字列をパラメーターとして受け取り、MultiBindingを使用してパラメーターを渡すこともできます。マルチバインディングについては、次のリンクを参照してください。

マルチバインディング情報

そしてこれはコンバーターに関する情報です:

コンバーター情報

最初のパラメーターとして「オブジェクト値」ではなく「オブジェクト[]値」を取り、それらをFormat関数に渡すコンバーターを簡単に想像できます。

2
Gabe