文字颜色取决于价值

时间:2012-04-01 18:19:36

标签: wpf xaml listbox textblock

首先,我是WPF和Xaml的新手,所以我希望你明白我在问什么。

我遇到了这种情况:有一个动物列表框。每个动物都有重量属性。我想要达到的目标是,当动物体重超过300公斤时,体重应显示为红色。

2 个答案:

答案 0 :(得分: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. 您不需要对默认颜色进行硬编码,而是使用Binding.DoNothing继承它。
  2. 您无需在视图模型中存储任何样式信息。

答案 1 :(得分: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}" />