2011-02-09 4 views
19

私は何か不思議に思っていて、関連するトピックを見つけることができませんでした。私は以下のバインディングを持っています:xamlでバインドした後に文字を追加することはできますか?

Content="{x:Static resx:Resource.Form_OtherOption_Description}" 

これはラベルに文字列を置きます。私は自分自身に尋ねていたのは、xamlのコードではなく、そのバインディングの後に ":"を追加できるかどうかです。ラベルは「名前:」のようなものです。しかし、バインディングの一部として「:」を追加することは選択肢ではありません。

編集

私は3.5バージョン

任意の提案で働いています。

ありがとうございます。

+0

3.5の場合は、@ H.B.の解決策を使用する必要があります。 – user7116

答えて

30

次のようなもので、これを達成できます。

<TextBlock Text="{Binding Source={x:Static resx:Resource.Form_OtherOption_Description}, 
         StringFormat={}{0}:}" /> 

編集:<Label>Contentプロパティは明らかにバインディングのStringFormat財産を尊重していません。私が見つけたものは<Label>ContentStringFormatに移されました。

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding StringFormat="ID {0} Name: {1} Age: {2}"> 
      <Binding Source="{x:Static resx:SomeResx.ID}"/> 
      <Binding Path="Name"/> 
      <Binding Path="Age"/> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

あなたがコンテンツコントロールのTextBlock TextBlock.Textでこれを使用することができます(すみません、私は上記のコードは、このために表示することができませんでした:あなたはまた、StringFormatなどでMultiBindingのを使用することができます

<Label Content="{x:Static resx:Resource.Form_OtherOption_Description}" 
     ContentStringFormat="{}{0}:" /> 
+1

+1、あなたも答えを見つけました:)それで 'ContentControl'は' ContentStringFormat'を持ち、 'HeaderedContentControl'は' HeaderStringFormat'を持ち、 'ItemsControl'は' ItemStringFormat'を持っています。知っておくべきこと –

+1

'Label.Content'は' TargetType'が 'string'ではなく' object'であるため、バインディングから 'StringFormat'を受け取っていないようです。 'TextBlock.Text'の場合、ターゲットタイプは' string'なので、バインディングで使用されます。 – user7116

+1

良い点 - エレガントではありませんが、ラベルコンテンツにTextBlockを追加できますが、これは追加のオーバーヘッドになります。 – Andrew

0

入力文字列を受け取り、 ":"を追加するコンバータを作成できます。

public class AddStringToStringConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string input = value as string; 
     string suffix = parameter as string; 

     return input + suffix; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

XAML:

<Window.Resources> 
    <local:AddStringToStringConverter x:Key="AddStringToStringConverter"/> 
</Window.Resources> 
... 
<Label Text="{Binding Source={x:Static resx:Resource.Form_OtherOption_Description}, Converter={StaticResource AddStringToStringConverter}, ConverterParameter=:}"/> 

またはそのような何か。それを試して、少なくとも私のソースのために働いた。

あなたに空白などがある場合は、ConverterParameterをsignle引用符を使用して削除できないようにすることができます。

編集:ええ...右ああ...私は前に必要なことがないStringFormatもあります、ehehehe ...

3

はのバインディングプロパティStringFormatを試してみてください - それはあなたが望むものを非常に簡単に行うことができます。

9

あなたがWPF 4.0を使用している場合)

+0

上記の6つの文字変数ごとに、ラベルはcontentStringFormatを使用します。上記のマルチバインディングをラベルと共に使用するには、その内容にTextBlockを割り当てます。 – Andrew

19

は、あなたもこれを行うことができます:

<TextBlock> 
     <Run Text="{Binding SomeLabel}"/> 
     <Run Text=":"/> 
</TextBlock> 

これを実際にRunタグから2つの文字列を連結し、TextBlock.Textプロパティにコピーします。

この方法を使用すると、プレゼンターのさまざまなプロパティにバインドして、単一のTexBlockに表示することもできます。この優れた例を参照してください:

Can we concat two properties in data binding?

3

はいすることができます。ここでは、Windows Phoneにテキスト(clouds.all)をバインドした後に「テスト」を追加します。あなたは%が追加でプログレスバーの値を視覚化することができ、このように

<Label x:Name="Progress" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontWeight="Bold" Foreground="White" Opacity=".7" 
     Content="{Binding Path=Value, RelativeSource={RelativeSource TemplatedParent}}" ContentStringFormat="{}{0}%"> 

:あなたはプログレスバーの内側にラベルを使用する場合

<TextBlock Text="{Binding Path=clouds.all, StringFormat=\{0\}testing}"/> 
1

あなたはこの方法を使用することができます。

関連する問題