Цвет текста зависит от значения - PullRequest
0 голосов
/ 01 апреля 2012

Прежде всего, я новичок в WPF и Xaml, поэтому я просто надеюсь, что вы понимаете, о чем я спрашиваю.

У меня возникла такая ситуация: существует список Box of Animals.Каждое животное имеет свойство веса.То, чего я пытаюсь добиться, это когда вес животного превышает 300 кг, этот вес должен отображаться красным цветом.

Ответы [ 2 ]

2 голосов
/ 01 апреля 2012

Вы можете использовать собственный конвертер для достижения этой цели. Если ваш товар выглядит так:

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. Вам не нужно хранить информацию о стиле в модели представления.
0 голосов
/ 01 апреля 2012

Вы можете создать 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}" />
...