2010-04-26 23 views
14

Bir dizeye bağlı bir WPF TextBlock var. Bu dize boşsa, TextBlock'un başka bir renkte bir uyarı iletisi görüntülemesini istiyorum.Bir WPF TextBlock'u koşullu olarak nasıl biçimlendiririm?

Bu kod içinde yapmak kolay, bunun için şık bir WPF saf XAML çözümü olup olmadığını merak ediyordum? Stil Tetikleyicileri araştırdım, ancak sözdizimi doğal olarak bana gelmiyor.

Teşekkürler!

BTW
<TextBlock Text="{Binding MyTextProperty}"> 
    <TextBlock.Style> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding MyTextProperty}" Value="{x:Null}"> 
        <Setter Property="Text" Value="Hey, the text should not be empty!"/> 
        <Setter Property="Foreground" Value="Red"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 

: Bu tamamen bellekten, VS kontrol veya Blend etmedi mi

cevap

23

gerekli DataTrigger bazı şeyler olarak Daniel's (slightly short) answer bazı ayrıntıları ekleme (gibi {x:Null}) gerçekten önemsiz değil Bu yüzden orada bir hata varsa lütfen kusura bakmayın. Ancak, bunları kendiniz çözebilmeniz gerekir. Fikrin ne olduğu önemlidir. İyi şanslar!

+0

Soru bağlamında stil/tetikleyicilerde görünürlük ayarlamak ve ilk satırda metin ve renk ayarlarına sahip olmak isteyebilirsiniz. Ancak bu cevap, daha karmaşık formatlamanın başlangıcını gösterdiği için hala iyidir. – apc

9

Bunun için dönüştürücüyü kullanabilirsiniz. Sadece IValueConverter ile sınıf oluşturun.

public class TextBlockDataConveter:IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null) 
     { 
      return "Error Message"; 
     } 
     else 
     { 
      return value; 
     } 
    } 

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

    #endregion 
} 

class TextBlockForegroundConverter:IValueConverter 
{ 

    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null) 
     { 

      SolidColorBrush brush = new SolidColorBrush(); 
      brush.Color = Colors.Red; 
      return brush; 
     } 
     else 
     { 
      SolidColorBrush brush = new SolidColorBrush(); 
      brush.Color = Colors.Black; 
      return brush; 

     } 
    } 

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

    #endregion 
} 

çalışır: Sonra DataBinding içinde XAML

<Window x:Class="WpfApplication4.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:lib="clr-namespace:WpfApplication4" 
    Title="Window1" Height="300" Width="300"> 

<Window.Resources> 
    <lib:TextBlockDataConveter x:Key="DataConverter"/> 
    <lib:TextBlockForegroundConverter x:Key="ColorConverter"/> 
</Window.Resources> 

<Grid> 
    <TextBlock Text="{Binding Path=message, Converter ={StaticResource DataConverter}}" Foreground="{Binding message, Converter={StaticResource ColorConverter}}"/> 
</Grid> 

ve dönüştürücüler Örneğin bu dönüştürücü

kullanın. Kontrol et.

+1

Bu kadar basit bir görev için biraz fazla kod olduğunu düşünmüyor musunuz ?! – gehho

+1

Evet, çok fazla kod. Görevinizi DataTriggers ile de yapabilirsiniz. Ancak bu çözüm daha esnektir. – Polaris

+0

Merhaba Polaris, teşekkürler, ama özellikle bir Xaml çözümü için arıyordum. –

İlgili konular