WPF TextBlock Отрицательный номер в красном - PullRequest
8 голосов
/ 08 июля 2010

Я пытаюсь найти лучший способ создать стиль / триггер, чтобы установить передний план на красный, когда значение <0. Каков наилучший способ сделать это?Я предполагаю, что DataTrigger, но как я могу проверить отрицательное значение, нужно ли мне создавать свой собственный IValueConverter? </p>

Ответы [ 3 ]

14 голосов
/ 08 июля 2010

Если вы не используете модель MVVM (где у вас может быть свойство ForegroundColor), то проще всего создать новый IValueConverter, привязывающий ваш фон к вашему значению.

В MyWindow.xaml:

<Window ...
    xmlns:local="clr-namespace:MyLocalNamespace">
    <Window.Resources>
        <local:ValueToForegroundColorConverter x:Key="valueToForeground" />
    <Window.Resources>

    <TextBlock Text="{Binding MyValue}"
               Foreground="{Binding MyValue, Converter={StaticResource valueToForeground}}" />
</Window>

ValueToForegroundColorConverter.cs

using System;
using System.Windows.Media;
using System.Windows.Data;

namespace MyLocalNamespace
{
    class ValueToForegroundColorConverter: IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            SolidColorBrush brush = new SolidColorBrush(Colors.Black);

            Double doubleValue = 0.0;
            Double.TryParse(value.ToString(), out doubleValue);

            if (doubleValue < 0)
                brush = new SolidColorBrush(Colors.Red);

            return brush;
        }

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

        #endregion
    }
}
8 голосов
/ 09 июля 2010

В вашем ViewModel должна быть информация о вашем представлении. Но вы можете избавиться от информации, специфичной для стиля, во ViewModel.

Следовательно, создайте свойство во ViewModel, которое будет возвращать значение bool

public bool IsMyValueNegative { get { return (MyValue < 0); } }

И используйте его в DataTrigger, чтобы можно было исключить ValueConverter и его упаковку / распаковку.

<TextBlock Text="{Binding MyValue}"> 
  <TextBlock.Style> 
    <Style> 
      <Style.Triggers> 
        <DataTrigger Binding="{Binding IsMyValueNegative}" Value="True"> 
          <Setter Property="Foreground" Value="Red" /> 
        </DataTrigger> 
      </Style.Triggers> 
    </Style> 
  </TextBlock.Style> 
</TextBlock> 
4 голосов
/ 15 марта 2012

Для решения Амсаканны мне пришлось добавить имя класса в Property Setter:

...