現在、以下のTextBlock
を使用して、Name
という名前のプロパティの値をバインドしています。
<TextBlock Text="{Binding Name}" />
ここで、anotherプロパティID
を同じTextBlock
にバインドします。
同じTextBlock
に2つ以上の値をバインドすることは可能ですか? Name + ID
のような単純な連結で行うことができますか?そうでない場合は、他にどのようにこれにアプローチできますか?
MultiBinding
を StringFormat
プロパティと組み合わせて使用できます。使用法は次のようになります。
<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以降でのみサポートされます。
私はこれがかなり遅いことを知っていますが、私はこれを行う別の方法を追加すると思いました。
Textプロパティは " Run s"を使用して設定できるため、各Runを使用して複数のバインディングを設定できます。これは、MultiBindingにアクセスできない場合に便利です(Windows Phone用に開発したときに見つかりませんでした)。
<TextBlock>
<Run Text="Name = "/>
<Run Text="{Binding Name}"/>
<Run Text=", Id ="/>
<Run Text="{Binding Id}"/>
</TextBlock>
これらがテキストブロックになるため(つまり、一方向のバインド)、値を連結する場合は、2つのテキストブロックをバインドして、水平のスタックパネルに配置します。
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding ID}"/>
</StackPanel>
これにより、テキストを表示します(これはすべてのTextblockで行われます)。これ以上コーディングする必要はありません。ただし、それらを正しく見えるようにするために、それらに小さなマージンを置くことができます。
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}}" />