2012-04-01 9 views
0

まず、WPFとXamlの新機能ですので、私が尋ねていることを理解していただければ幸いです。テキストの色は値に依存します

私はこの状況になっています:動物のリストボックスがあります。すべての動物には重量特性があります。私が達成しようとしているのは、動物の体重が300kgを超えると、体重が赤く表示されるはずです。

答えて

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をハードコードする必要はありません超色ですが、Binding.DoNothingを使用して継承します。
  2. ビューモデルにスタイル情報を格納する必要はありません。
+0

ありがとうございました。できます! – BojanSM

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

関連する問題