web-dev-qa-db-ja.com

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

現在、以下のTextBlockを使用して、Nameという名前のプロパティの値をバインドしています。

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

ここで、anotherプロパティIDを同じTextBlockにバインドします。

同じTextBlockに2つ以上の値をバインドすることは可能ですか? Name + IDのような単純な連結で行うことができますか?そうでない場合は、他にどのようにこれにアプローチできますか?

179
Spen D

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

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

NameのFooの値とIDの1の値を指定すると、TextBlockに出力されるのはFoo + 1になります。

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

381
Richard McGuire

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

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

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

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

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

これにより、テキストを表示します(これはすべてのTextblockで行われます)。これ以上コーディングする必要はありません。ただし、それらを正しく見えるようにするために、それらに小さなマージンを置くことができます。

21
CodeWarrior

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}}" />
10
Preet Sangha