2009-09-15 11 views
7

İstemcilerin yaşını görüntülemek için aşağıdaki koda sahibim.WPF Bir TextBox'ta Bound ve Sabit Metin Karıştırma

<TextBox x:Name="txtClientAge" Text="{Binding Path=ClientAge}" /> 

Ancak, bunun yerine sadece sadece numarayı gösterme, bunu etkili bir şekilde "Yaşı 36 yıl"

hale gelir böylece metin "Yaş", öneki ve metin "yaş" ile soneki istiyorum

Bunu yatay StackPanel ve 3 Textboxes ile yapabilirim, ancak eksik olduğum daha basit bir yöntem var mı?

+0

"Yaş" ve "yrs" parçalarının düzenlenebilir olmasını ister misiniz? Yani Kullanıcının bütünüyle metin kutusuna "40 yaş" (veya belki de "40") yazmasına izin verilmeli ve doğru şekilde ayrıştırılmış mı? –

+0

Her halükarda, eğer uygulamanızda sadece böyle bir metin kutunuz varsa (yani, yeniden kullanılabilir olması gerekmiyorsa), StackPanel + 2 TextBlocks + TextBox çözümü en kolay olacak. –

+0

Sadece readonly olarak kullanılacak, güncelleme gerektirmez. – Mitch

cevap

8

Düzenlenebilir olması gereken yaş değerine ihtiyacınız olmadığının varsayılması durumunda, WPF 4.0'da Çalıştırma'nın Text özelliği çalıştırılabilir durumdadır, bu ön sürümleri kullanmıyorsanız muhtemelen size yardımcı olmaz. aşağıdaki gibi bir şey yapabilir:

<TextBlock x:Name="txtClientAge" > 
    <Run Text="Age "/><Run Text="{Binding Path=ClientAge}"/><Run Text=" Yrs"/> 
</TextBlock> 

UPDATE İşte çalışır ancak (aslında onun oldukça hacky olarak) özellikle hoş değil edecek biçim dizesi çözümü için başka bir alternatif.

public class AgeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
          System.Globalization.CultureInfo culture) 
    { 
     string age = value.ToString(); 
     return "Age " + age + " years"; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
           System.Globalization.CultureInfo culture) 
    { 
     string age = value as string; 
     return Int32.Parse(age.Replace("Age ", " ").Replace(" years", "")); 
    } 
} 
+0

Teşekkürler Simon, aradığım şey buydu ama dediğiniz gibi, henüz bizimle değil! WPF 4.0, bizimle birlikte olana kadar uzun soluklu bir yaklaşımı benimsemeliyim. – Mitch

+0

Güzel yanal düşünme arkadaşı. Şu anda her türlü şey için Dönüştürücüleri kullanmaktan keyif alıyorum, bu yüzden yaklaşımınız gerçekten cazip geliyor. Bunun için teşekkürler! – Mitch

+0

Evet, ConvertBack sevmediğim bölümdür, ancak bu durum, bir sorun olmayacak bir durumdur. –

5

Bağlamak istediğiniz sınıfta, görüntülemek istediğiniz metin dizesini oluşturan bir özellik oluşturabilirsiniz.

da StringFormat bir yol var:

<textblock text="{Binding Path=mydate, StringFormat=d}"/> 

Sen biçimlendirme dizesine sabitleri kesmek olabilir.

Özellik yöntemini tercih ederim.

+3

Bu, modelinizin, tasarım açısından çok kötü bir fikir olan, farkında olmak için modifiye edilmesidir.StringFormat için –

+1

+1. @Pavel ile katılıyorum - bu metinde bir özellik oluşturmayın. – Andy

+2

Eğer gerçekten bunu doğru yapmak istiyorsanız, metin de görünüme ait değil. Mevcut kültür ayarınıza göre sunum katmanı tarafından seçilen bir kaynak alanında olması gerekir. Bu yüzden tüm eşyalarım sunucu özelliklerinden geliyor. – Jay

5

Bu oldukça eski bir sorudur ama (metnin düzenlemek istiyorsanız) bu mevcut en iyi çözüm olduğunu düşünüyorum: bağlayıcı aşağıdaki dönüştürücü (varsayarak clientage mülkiyet int türünde) kullanın.

Bir TextBlock iç içe Textbox ile InlineUIContainer ile yapabilirsiniz.

Not: Bileşenleri hizalamak için BaselineAlignment="Center" kullanıyorum. Gerekirse TextBox'a pozitif veya negatif kenar boşlukları ekleyebilirsiniz. Ayrıca, 'un kenarlığını, düzenlenebilir ve seçilebilir olsa bile TextBlock'un bir parçası gibi görünmesini sağlamak için şeffaf olarak ayarladım.

<TextBlock Foreground="SteelBlue"> 
    <Run Text="Package Barcode:" FontWeight="Bold" BaselineAlignment="Center"/> 
    <InlineUIContainer BaselineAlignment="Center"> 
     <TextBox Margin="2,0,0,0" Foreground="Gray" Text="{Binding BarcodeNumber}" BorderThickness="0" Padding="0"/> 
    </InlineUIContainer> 
</TextBlock> 
+1

evet asıl soru soranın nihayetinde 'yaşın' sadece okunmasını istediğini fark ettim ama bu soruya sorulan soruya bir cevaptır :-) –

1

Bu önceki yanıt gibi - (ama işte bir metin kutusu versiyonu ... tüm Texblocks beraberler), ben de MultiBinding yaklaşımını göstermek istedik. Bunu bir kullanıcı kodu kopyalayabilirsiniz metin seçilebilir yapmak istiyorsanız

<TextBox> 
<TextBox.Text> 
    <MultiBinding StringFormat="Age {0} yrs and {1} months"> 
    <Binding Path="Years" /> 
    <Binding Path="Months" /> 
    </MultiBinding> 
</TextBox.Text> 
</TextBox> 

Bu yararlı olabilir: Ne istediğinizi yapmak için bir texbox almak için aşağıdaki kodu kullanabilirsiniz.