2010-11-17 22 views
48

Amount is X dizgisini, X etiketine bağlı bir özellik olarak biçimlendirmek istiyorum.WPF StringFormat üzerindeki Etiket İçeriği

ben pek çok örnek gördüm ancak aşağıdaki çalışmıyor: int bağlanma tesisin veri türü değişen

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

Hatta çalıştı:

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

Ben de bu kombinasyonları denedim , string ve double. Hiçbir şey işe yaramıyor. Bu çok yaygın bir kullanım durumudur, ancak desteklenmiyor gibi görünmektedir.

cevap

138

Bu işe yaramazsa nedeni Label.Content özellik türü Object ait olduğunu ve Binding.StringFormat olmasıdır yalnızca String türünde bir özelliğe bağlandığında kullanılır. neler oluyor

geçerli:

  1. Binding

    sizin MaxLevelOfInvestment değerini boks ve bir kutulu ondalık değer olarak Label.Content özelliğini depoluyor.
  2. Etiket denetimi, ContentPresenter içeren bir şablona sahiptir.
  3. ContentTemplate ayarlandığı için, ContentPresenter, Decimal türü için tanımlanmış bir DataTemplate arar. Hiçbiri bulamazsa, varsayılan bir şablon kullanır.
  4. ContentPresenter tarafından kullanılan varsayılan şablon, etiketin ContentStringFormat özelliğini kullanarak dizeleri sunar.

iki çözelti de mümkündür: Bunun yerine Binding.StringFormat arasında

  • kullanımı Label.ContentStringFormat veya
  • örneğin
TextBlock.Text yerine Label.Content olarak bir String özelliğini kullanın

Etiketin nasıl kullanılacağı aşağıda açıklanmıştır.ContentStringFormat: sırasında ContentPresenter aslında kendi Template ve StringFormat özelliklerini kullanır, ancak:

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

Not: Yukarıdaki açıklama bir detayı ihmal Kolaylık olması açısından burada

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

bir TextBlock nasıl kullanılacağı ise Bunların yüklenmesi otomatik olarak ContentTemplate ve Label'un ContentStringFormat özelliklerine şablonla bağlı olduğundan, ContentPresenter aslında Label'un özelliklerini kullanıyor gibi görünüyor.

+0

olarak kullanabilirsiniz, şimdi anlamlıdır. Gelecek için bu temizliği yapmak için WPF ekibine kadar. –

+0

Cevabınızı beğendim, sadece 1 yerine 2 paramın nasıl kullanılacağını biliyor musunuz? Burada gerçekten mücadele (TextBlock stringFormat gibi tetikleyiciler vb. Kullanırken birden fazla işlem yapabilir). – EricG

1

bir dönüştürücü kullanmayı deneyin ....

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

Bu gerekli değildir ve biçimi arka planda gizler. – SLaks

+0

Belki de, ancak bu sorunu çözecektir. – Gabe

+3

Bu aşırı. Sorunun nedenini açıklarım ve cevabımda iki basit çözüm sunarım. –

3

Sadece kontrol ve dahili İçerik özellik için bir ContentPresenter kullanır muhtemelen nedense, Etiketi ile çalışmaz. Bunun yerine bir TextBlock kullanabilirsiniz ve bu işe yarayacaktır. Eğer stil, davranış miras gerekiyorsa Ayrıca Label içeriğinde aşağıdaki TextBlock alıntı koyabilirsiniz vb

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

evrensel StringFormatConverter : IValueConverter olun. Biçim dizginizi ConverterParameter olarak geçirin. Eğer, örneğin, Completed {0} tasks out of {1} biçim dizesi birden fazla nesne gerektiğinde

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

Ayrıca StringFormatMultiConverter : IMultiValueConverter olun.

+0

Bunu beğendim. Hem “XAML” yaklaşımını hem de değer dönüştürücüsünü kullanmanın değerini görebiliyorum. – IAbstract

İlgili konular