2010-03-03 26 views
5

Önekler için ayrı kontroller kullanmadan StackPanel'deki TextBlock kontrollerindeki bağlı değerleri nasıl önleyebilirim?Basit WPF biçimlendirme sorusu

Örneğin, bir kitap listesini görüntülemek için bir TreeView kullanan ve en üstteki düğümlerin başlık olduğu bir iletişim kutusu ve diğer kitap öznitelikleri için bir dizi bağımlı düğüm kümesi (ISBN, Yazar, vb.) Olduğunu varsayalım. .

Bağlantının düzgün çalışmasını sağlıyorum, ancak kullanıcım kitap öznitelikleri listesinin dikey olarak yığılmasını istiyor ve açık olarak, her özellik düğümünün değerden önce açıklayıcı bir önek olmasını istiyor (örneğin, "Yazar: Erich Gamma" yerine sadece "Erich Gamma"). HDT ve DT unsurlarımda, değerleri görüntülemek için StackPanel ve TextBlock denetimleri kullanıyorum.

ben her özellik

<!-- Works, but requires 2 controls to display the book author and the prefix stacks above the author --> 
<TextBlock Text="Author: "/><TextBlock Text="{Binding Path=Author}" /> 

veya her düğüm için tek TextBlock kontrolü ile bunu yapmanın bir yolu yoktur ait önek için ayrı TextBlock kontrolü kullanmak zorunda mı?

<!-- only one control, but doesn't work --> 
<TextBlock Text="Author: {Binding Path=Author}" /> 

bu sık karşılaşılan bir sorun olduğunu biliyoruz, ve bunun için google'dan ve ben üç WPF kitaplarında aradım ama çalıştığım şey ben aramak doğru yol bilmiyorum sanırım söylemek.

Teşekkürler!

cevap

6

Eğer .Net 3.5 SP1 olması, kolayca da bu

<TextBlock> 
    <TextBlock.Text> 
    <MultiBinding StringFormat="Author: {0}, Title: {1}"> 
     <Binding Path="Author"/> 
     <Binding Path="Title"/> 
    </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

SP1 kullanmıyorsanız, Sonra kullanabilirsiniz yapabilirsiniz

<TextBlock Text="{Binding Path=Title, StringFormat= Title: {0}}" /> 

StringFormat

üzerinden bu elde edebilirsiniz Bir ValueConverter

+0

Sizin yönteminiz benimkilerden daha temizdir :) – slugster

+0

evet .. ama bu özellik yalnızca 3.5SP1 – SysAdmin

+0

+1'den itibaren mevcuttur, ancak bağlamanın ne zaman başarısız olacağını veya geri bildirim verebildiğiniz için –

2

Hızlı kirli ve basit bir yöntem: dönüştürücü kullanın ve önek metnini dönüştürücü parametresi olarak iletin. Daha sonra çeviricide tüm yapmanız gereken dönüştürücü parametre metnini ciltleme metnine yerleştirmektir.

<TextBlock Text="{Binding Path=Title, Converter={StaticResource MyTextConverter}, ConverterParameter=Title}" /> 
<TextBlock Text="{Binding Path=ISBNNumber, Converter={StaticResource MyTextConverter}, ConverterParameter=ISBN}" /> 
<TextBlock Text="{Binding Path=AuthorName, Converter={StaticResource MyTextConverter}, ConverterParameter=Author}" /> 

public class MyTextConverter : IValueConverter 
{ 

    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value is string) 
     { 
      return string.Format("{0}{1}{2}", parameter ?? "", !string.IsNullOrEmpty(parameter) ? " : " : "", value); 
     } 
     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

Bu, başımın tepesinden iyiydi, içindeki küçük hataları affedin. Bu sadece bir metin bloğu kullanılarak yapılır. Tek yapmanız gereken dönüştürücüyü xaml dosyasının statik kaynaklarına dahil etmektir.

+0

Büyük öneri. Şuan yaptığım şeyden daha karmaşık bir şey için bunu yapmam gerektiğinden şüpheleniyorum. Teşekkürler! –