複数の値を単一のWPF TextBlockにバインドする方法は?


210

私は現在、TextBlock以下の名前を付けたプロパティの値をバインドするために使用していますName

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

次に、同じ名前の別のプロパティをバインドます。IDTextBlock

2つ以上の値を同じにバインドすることは可能TextBlockですか?それは単純な連結で行うことができますName + IDか?

回答:


434

プロパティMultiBindingと組み合わせて使用できStringFormatます。使用法は次のようになります。

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

寄付Nameの値FooIDの値を1、TextBlock内のあなたの出力は次のようになりFoo + 1

Note: これは、.NET 3.5 SP1および3.0 SP2以降でのみサポートされています。


5
@Preet-実際に '{}'が必要かどうかは定かではありませんが、MSDNサンプルで使用されていたので含めました。ただし、一般的には、Bindingマークアップ拡張機能との混乱を避けるために、XAMLパーサーのエスケープシーケンスとして必要です。
Richard McGuire

2
これには1つの副作用があります。このメソッドをDataGridソート動作などで使用すると、残念ながら機能しません。より適切な解決策は、バインドする適切な文字列形式を使用してモデルに読み取り専用プロパティを作成することです。言うまでもなく、これは少し冗長ではありますが、すばやくフォーマットするための適切な方法です。
ブレット・ライアン

34
書式文字列がパラメータ{0}で始まる場合は{}が必要ですが、書式文字列がテキストで始まる場合は必要ありません。例:「{} {0} + {1}」「ページ{0} / {1}」
Dakianth

これは、WPFのプロジェクト.NET 4.0のVisual Studio 2017で作業しませんでした
Sorush

@Patrickの解決策は私のために働いた。これを機能させることができませんでした。私はこのエラーを抱えていましたXamlParseException: A 'Binding' cannot be set on the 'Path' property of type 'Binding'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
タイソンウィリアムズ

127

私はこれが遅い方法であることを知っていますが、これを行う別の方法を追加したいと思いました。

Textプロパティは " Run s"を使用して設定できるため、それぞれにRunを使用して複数のバインディングを設定できます。これは、MultiBindingへのアクセス権がない場合に役立ちます(Windows Phone用に開発しているときに見つかりませんでした)。

<TextBlock>
  <Run Text="Name = "/>
  <Run Text="{Binding Name}"/>
  <Run Text=", Id ="/>
  <Run Text="{Binding Id}"/>
</TextBlock>

4
これは、DynamicResourceとしてソースされるいくつかの文字列にバインドするときに使用する非常に便利な方法です。これには、StringBindingを使用したMultiBindingを使用できないためです。
slugster 2013年

私はこれを試しました。これは機能しますが、(更新時に)描画されるすべての要素(ジオメトリも)が、何らかの理由で各ティックを点滅させます。他の方法を試すつもりです。
ローガンクレナー2014

6
順序がハードコーディングされているため、テキストをローカライズする必要がある場合、これは難しくなる可能性があります。
BlueM 2016

1
このアプローチの別の使用法は、バインディングごとに異なるスタイルを適用することです
Hamid Naeemi

2019年のベストアンサー
ファビオBCソウザ

23

これらがテキストブロック(つまり、一方向バインディング)になるだけで、値を連結したいだけの場合は、2つのテキストブロックをバインドして、水平スタックパネルに配置します。

    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Name}"/>
        <TextBlock Text="{Binding ID}"/>
    </StackPanel>

これにより、コーディングを行わなくてもテキスト(すべてのTextblockが行う)が表示されます。ただし、見栄えを良くするために、それらに小さなマージンを設けることもできます。


11

ValueConverterを使用する

[ValueConversion(typeof(string), typeof(String))]
public class MyConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return string.Format("{0}:{1}", (string) value, (string) parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {

        return DependencyProperty.UnsetValue;
    }
}

そしてマークアップで

<src:MyConverter x:Key="MyConverter"/>

。。。

<TextBlock Text="{Binding Name, Converter={StaticResource MyConverter Parameter=ID}}" />

はい-これは6年前に作成されたもので、最初の引数として「名前」をコンバーター(コードでは値と呼ばれます)にバインドし、ID(質問の文字列)を2番目の引数としてバインドしています。
Preet Sangha、2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.