1. ホーム
  2. .net

[解決済み] TextBlockのスタックを使わず文字列を連結する

2023-01-21 05:11:32

質問

WPFのItemsControlに顧客オブジェクトのリストを表示したいです。このためにDataTemplateを作成しました。

    <DataTemplate DataType="{x:Type myNameSpace:Customer}">
        <StackPanel Orientation="Horizontal" Margin="10">
            <CheckBox"></CheckBox>
            <TextBlock Text="{Binding Path=Number}"></TextBlock>
            <TextBlock Text=" - "></TextBlock>
            <TextBlock Text="{Binding Path=Name}"></TextBlock>
        </StackPanel>
    </DataTemplate>

私が基本的に欲しいものは、NUMBER - NAMEを含む単純なリスト(チェックボックス付き)です。バインディング部分で番号と名前を直接連結する方法はないのでしょうか?

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

StringFormatプロパティがあります(.NET 3.5 SP1)ので、おそらくそれを使うことができます。また、便利なWPFバインディングのチートシートがあります。 ここで . もしこれが役に立たなければ、独自のValueConverterやオブジェクトのカスタムプロパティを作成することができます。

確認したところ、StringFormatはマルチバインディングで使用できるようです。あなたの場合、以下のようなコードになると思います。

<TextBlock>
  <TextBlock.Text>
    <MultiBinding StringFormat=" {0} - {1}">
        <Binding Path="Number"/>
        <Binding Path="Name"/>
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>

フォーマット文字列をスペースで始めないと、Visual Studioがビルドできないのですが、これを回避する方法が見つかると思います :)

編集

スペースは StringFormat でパーサーが {0} を実際のバインディングとして扱わないようにするためです。他の選択肢として

<!-- use a space before the first format -->
<MultiBinding StringFormat=" {0} - {1}">

<!-- escape the formats -->
<MultiBinding StringFormat="\{0\} - \{1\}">

<!-- use {} before the first format -->
<MultiBinding StringFormat="{}{0} - {1}">