簡體   English   中英

標簽內容上的 WPF StringFormat

[英]WPF StringFormat on Label Content

我想將我的字符串綁定格式化為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 似乎沒有任何效果。 這是一個非常常見的用例,但似乎不受支持。

這不起作用的原因是Label.Content屬性是Object類型,而Binding.StringFormat僅在綁定到String類型的屬性時使用。

正在發生的事情是:

  1. Binding是拳擊您MaxLevelOfInvestment值並將其存儲在Label.Content財產作為套裝十進制值。
  2. Label 控件有一個包含ContentPresenter的模板。
  3. 由於未設置ContentTemplateContentPresenter查找為Decimal類型定義的DataTemplate 當它沒有找到時,它使用默認模板。
  4. ContentPresenter使用的默認模板通過使用標簽的ContentStringFormat屬性來呈現字符串。

有兩種解決方案:

  • 使用 Label.ContentStringFormat 而不是 Binding.StringFormat,或
  • 使用 String 屬性,例如 TextBlock.Text 而不是 Label.Content

下面是如何使用 Label.ContentStringFormat:

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

下面是如何使用 TextBlock:

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

注意:為了簡單起見,我在上面的解釋中省略了一個細節: ContentPresenter實際上使用了自己的TemplateStringFormat屬性,但是在加載過程中,這些屬性會自動綁定到LabelContentTemplateContentStringFormat屬性,因此看起來好像ContentPresenter實際上是在使用Label的屬性。

制作一個通用的StringFormatConverter : IValueConverter 將您的格式字符串作為ConverterParameter傳遞。

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

此外,當您需要格式字符串中的多個對象時,請制作StringFormatMultiConverter : IMultiValueConverter ,例如, Completed {0} tasks out of {1}

我剛剛檢查過,由於某種原因它不適用於 Label,可能是因為它在內部使用 ContentPresenter 作為 Content 屬性。 您可以改用 TextBlock,這樣就可以了。 如果您需要繼承樣式、行為等,您還可以將下面的 TextBlock 摘錄放在 Label 的內容中。

<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;
    }
}

也許這會有所幫助...

在 XAML 中嵌入代碼

你可以在下面使用這個

<Label Text="{Binding Content, StringFormat='Page Data> {0}'}" />

“內容”是綁定變量,在單引號之間鍵入您的文本。 {0} 將插入內容數據的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM