web-dev-qa-db-ja.com

ラベルコンテンツのWPF StringFormat

文字列バインディングをAmount is Xとしてフォーマットします。ここで、Xはラベルにバインドされたプロパティです。

私は多くの例を見てきましたが、以下は動作しません:

<Label Content="{Binding Path=MaxLevelofInvestment, 
   StringFormat='Amount is {0}'}" />

私はこれらの組み合わせも試しました:

StringFormat=Amount is {0}
StringFormat='Amount is {}{0}'
StringFormat='Amount is \{0\}'

バインディングプロパティのデータ型をintstringdoubleに変更してみました。何も機能しないようです。これは非常に一般的な使用例ですが、サポートされていないようです。

66

これが機能しない理由は、Label.ContentプロパティはObject型であり、Binding.StringFormatは、String型のプロパティにバインドする場合にのみ使用されます。

何が起こっているのですか:

  1. BindingMaxLevelOfInvestment値をボックス化し、Label.Contentプロパティをボックス化された10進数値として。
  2. Labelコントロールには、ContentPresenterを含むテンプレートがあります。
  3. ContentTemplateが設定されていないため、ContentPresenterDataTemplateタイプに対して定義されたDecimalを探します。何も見つからない場合、デフォルトのテンプレートを使用します。
  4. ContentPresenterで使用されるデフォルトのテンプレートは、ラベルのContentStringFormatプロパティを使用して文字列を表示します。

次の2つのソリューションが可能です。

  • Binding.StringFormatの代わりにLabel.ContentStringFormatを使用する、または
  • Label.Contentの代わりにTextBlock.TextなどのStringプロパティを使用します

Label.ContentStringFormatの使用方法は次のとおりです。

<Label Content="{Binding Path=MaxLevelofInvestment}" ContentStringFormat="Amount is {0}" />

TextBlockの使用方法は次のとおりです。

<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is {0}'}" />

注:簡単にするために、上記の説明では詳細を1つ省略しました。ContentPresenterは実際に独自のTemplateおよびStringFormatプロパティを使用しますが、ロード中にこれらは自動的にテンプレートバインドされますContentTemplateContentStringFormatおよびLabelプロパティは、ContentPresenterが実際にLabelのプロパティを使用しているように見えます。

175
Ray Burns

ユニバーサルStringFormatConverter : IValueConverter。書式文字列をConverterParameterとして渡します。

Label Content="{Binding Amount, Converter={...myConverter}, ConverterParameter='Amount is {0}'"

また、StringFormatMultiConverter : IMultiValueConverter書式文字列に複数のオブジェクトが必要な場合、たとえばCompleted {0} tasks out of {1}

5

確認したところ、何らかの理由でLabelで機能しません。おそらく、ContentプロパティにContentPresenterを内部的に使用しているためでしょう。代わりにTextBlockを使用できますが、それは機能します。スタイリング、動作などを継承する必要がある場合は、Labelのコンテンツに以下のTextBlockの抜粋を挿入することもできます。

<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is \{0\}'} />
4
Guy

コンバーターを使用してみてください。

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


<Label Content="{Binding Path=MaxLevelofInvestment, Converter={StaticResource MyConverter"} />


public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return String.Format("Amount is {0}", value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
}
1
Gabe

たぶんこれが役立つでしょう...

XAMLにコードを埋め込む

1
strattonn