文字列バインディングを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\}'
バインディングプロパティのデータ型をint
、string
、double
に変更してみました。何も機能しないようです。これは非常に一般的な使用例ですが、サポートされていないようです。
これが機能しない理由は、Label.Content
プロパティはObject
型であり、Binding.StringFormat
は、String
型のプロパティにバインドする場合にのみ使用されます。
何が起こっているのですか:
Binding
はMaxLevelOfInvestment
値をボックス化し、Label.Content
プロパティをボックス化された10進数値として。ContentPresenter
を含むテンプレートがあります。ContentTemplate
が設定されていないため、ContentPresenter
はDataTemplate
タイプに対して定義されたDecimal
を探します。何も見つからない場合、デフォルトのテンプレートを使用します。ContentPresenter
で使用されるデフォルトのテンプレートは、ラベルのContentStringFormat
プロパティを使用して文字列を表示します。次の2つのソリューションが可能です。
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
プロパティを使用しますが、ロード中にこれらは自動的にテンプレートバインドされますContentTemplate
のContentStringFormat
およびLabel
プロパティは、ContentPresenter
が実際にLabel
のプロパティを使用しているように見えます。
ユニバーサルStringFormatConverter : IValueConverter
。書式文字列をConverterParameter
として渡します。
Label Content="{Binding Amount, Converter={...myConverter}, ConverterParameter='Amount is {0}'"
また、StringFormatMultiConverter : IMultiValueConverter
書式文字列に複数のオブジェクトが必要な場合、たとえばCompleted {0} tasks out of {1}
。
確認したところ、何らかの理由でLabelで機能しません。おそらく、ContentプロパティにContentPresenterを内部的に使用しているためでしょう。代わりにTextBlockを使用できますが、それは機能します。スタイリング、動作などを継承する必要がある場合は、Labelのコンテンツに以下のTextBlockの抜粋を挿入することもできます。
<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is \{0\}'} />
コンバーターを使用してみてください。
<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;
}
}
たぶんこれが役立つでしょう...