WPF XAML bağlamasına bir dize eklemek için StringFormat kullanın


125

Bir tamsayı değerine tek yönlü bağlanma (bu durumda Santigrat derece cinsinden sıcaklık) olan bir TextBlock içeren bir WPF 4 uygulamam var. XAML şuna benzer:

<TextBlock x:Name="textBlockTemperature">
        <Run Text="{Binding CelsiusTemp, Mode=OneWay}"/></TextBlock>

Bu, gerçek sıcaklık değerini görüntülemek için iyi çalışıyor, ancak bu değeri yalnızca sayı yerine ° C'yi içerecek şekilde biçimlendirmek istiyorum (yalnızca 30 yerine 30 ° C). StringFormat hakkında bir şeyler okudum ve bunun gibi birkaç genel örnek gördüm:

// format the bound value as a currency
<TextBlock Text="{Binding Amount, StringFormat={}{0:C}}" />

ve

// preface the bound value with a string and format it as a currency
<TextBlock Text="{Binding Amount, StringFormat=Amount: {0:C}}"/>

Ne yazık ki, gördüğüm örneklerin hiçbiri, yapmaya çalıştığım gibi bağlı değere bir dize eklemedi. Eminim basit bir şey olmalı ama onu bulmakta hiç şansım yok. Biri bana bunun nasıl yapılacağını açıklayabilir mi?

Yanıtlar:


218

İlk örneğiniz, ihtiyacınız olan şeydir:

<TextBlock Text="{Binding CelsiusTemp, StringFormat={}{0}°C}" />

20
Xaml'deki dize biçiminin başındaki neden boş {}?
Jonesopolis

6
@Jonesopolis Dokümanlarda var - ancak biçim dizeniz a ile başlıyorsa, xaml'de zaten bir anlamı {olduğundan, kaçmak için bir mekanizma sağlar {}.
Reed Copsey

5
Belgelerin baştaki {} ifadesini nerede açıkladığını göremiyorum.
Eric

5
@Eric Birçok dokümantasyon gibi, kokuyor - bunu gösteriyorlar ama açıklamıyorlar.
Reed Copsey

19
burada gizemli {} dokümantasyonu: msdn.microsoft.com/en-us/library/ms744986.aspx
Jotrius

107

Dizenin ortasında veya birden çok bağlamanın ortasında Bağlama varsa, okunabilirlik açısından iyi çalışan bir alternatif:

<TextBlock>
  <Run Text="Temperature is "/>
  <Run Text="{Binding CelsiusTemp}"/>
  <Run Text="°C"/>  
</TextBlock>

<!-- displays: 0°C (32°F)-->
<TextBlock>
  <Run Text="{Binding CelsiusTemp}"/>
  <Run Text="°C"/>
  <Run Text=" ("/>
  <Run Text="{Binding Fahrenheit}"/>
  <Run Text="°F)"/>
</TextBlock>

6
Bu yanıtı biraz daha çok beğendim çünkü bir dizi kitaplığından kolayca metin ekleyebiliyorum. Elbette, uluslararasılaştırma konusunda gerçekten endişeleniyorsanız, bir dönüştürücü kullanmanız muhtemelen daha iyi olacaktır, bu nedenle sayı ve birimlerin sırası sabit değildir. <Run Text = "{x: Static s: UIStrings.General_FahrenheitAbbreviation}" />
Matt Becker

1
Bu harika bir çözüm, ancak Metin Çalıştırmaları arasında son metin görünümünde fazladan boşluk alıyorum - neden olduğu hakkında bir fikriniz var mı? 0 °C ( 32 °F)
Conrad

Gerçek dize biçimlendirmesi yapmak istiyorsanız (yani ondalık basamakların sayısını kontrol etmek vb.) Çok kullanışlı değildir.
BrainSlugs83

5
@Conrad Her çalıştırma arasındaki boşlukları istemiyorsanız, bu işlemleri aşağıdaki gibi tek bir satıra koymalısınız: <TextBlock> <Run Text = "{Binding CelsiusTemp}" /> <Run Text = "° C" / > <Run Text = "(" /: <Run Text = "{Binding Fahrenheit}" /> <Run Text = "° F)" /> </TextBlock>
Ladislav Ondris

94

Bağlamalarda StringFormat kullanmanın yalnızca "metin" özellikleri için işe yarayacağını lütfen unutmayın. Bunu Label.Content için kullanmak işe yaramayacak


16
Bir ÇOK Çaresiz var ve benim şüphe doğrulamak için bu yorum bulunamadı dek sürdü önemli nokta bana çalışıyor.
DonBoitnott

64
ContentStringFormatkurtarma, örneğe gelince: Content="{Binding Path=TargetProjects.Count}" ContentStringFormat="Projects: {0}".
astrowalker

2
Teşekkürler Casper, bu bilgiyi gönderdiğiniz için gerçek kahraman.
DaWiseguy

5
GridViewColumn başlıkları için şunu kullanınHeaderStringFormat="{}{0} For Report"
Felix

2
Tasarım zamanı verilerini kullanıyorsanız, değişiklikleri tasarımcıya yansıtmak için ContentStringFormat'ı düzenledikten sonra projeyi yeniden oluşturmanız gerekiyor gibi görünüyor, oysa StringFormat, bir metin kutusunun tasarımcıyı gerçek zamanlı olarak güncelleyeceğini söylüyor.
Richard Moore

-8

Xaml olarak

<TextBlock Text="{Binding CelsiusTemp}" />

In ViewModeldeğeri ayarlayarak bu şekilde de çalışır,:

 public string CelsiusTemp
        {
            get { return string.Format("{0}°C", _CelsiusTemp); }
            set
            {
                value = value.Replace("°C", "");
              _CelsiusTemp = value;
            }
        }

19
Bu, View-Viewmodel ayrılığının tüm noktasına aykırı
Askolein
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.