2012-04-01 82 views
0

首先,我是WPF和Xaml的新手,所以我只是希望你明白我在問什麼。文本顏色取決於值

我得到了這種情況:有一個動物列表框。每隻動物都有重量屬性。我試圖達到的目標是每當動物體重超過300公斤時,體重應顯示爲紅色。

回答

2

你可以使用自定義的轉換器來實現這一點。如果您的項目看起來像這樣:

public class Animal 
{ 
    public int Weight { get; set; } 
    public string Name { get; set; } 
} 

和ItemTemplate裏那樣:

<DataTemplate x:Key="AnimalTemplate"> 
    <TextBlock Text="{Binding Name}" Foreground="{Binding Weight, Converter={StaticResource AnimalColorSelector}}"/> 
</DataTemplate> 

你的轉換器會像下面的一個:

public class AnimalColorSelector : IValueConverter 
{ 
    private readonly Color _overweightColor = Colors.Red; 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value is int) 
     { 
      return (int) value > 300 ? new SolidColorBrush(_overweightColor) : Binding.DoNothing; 
     } 

     return Binding.DoNothing; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

這種方法具有以下優點:

  1. 您不需要硬編碼defa ult顏色,但通過使用Binding.DoNothing繼承它。
  2. 您不需要在視圖模型中存儲任何樣式信息。
+0

非常感謝。有用! – BojanSM 2012-04-01 19:46:35

0

您可以爲動物創建一個ViewModel,其中包含必要的顏色設置邏輯。就像這樣:

public class VMAnimal : INotifyPropertyChanged 
{ 
    private int _weight; 
    public int Weight 
    { 
     get { return _weight; } 
     set 
     { 
      _weight = value; 
      RaisePropertyChanged("Weight"); 
      RaisePropertyChanged("Color"); 
     } 
    } 

    public Brush Foreground 
    { 
     get 
     { 
      if (Weight > 300) 
       return new SolidColorBrush(Color.Red); 
      return new SolidColorBrush(Color.Black); 
     } 
    } 
} 

而且,像這樣結合使用:

<TextBlock Text="{Binding Weight}" Foreground="{Binding Foreground}" /> 
+0

或使用轉換器 – Phil 2012-04-01 19:08:06

相關問題