Я пытаюсь выяснить лучший способ создать стиль/триггер для установки переднего плана на Красного, когда значение <0. что лучший способ состоит в том, чтобы сделать это? Я принимаю DataTrigger, но как я могу проверить на отрицательную величину, я должен создать свой собственный IValueConverter?
Если вы не используете модель 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
}
}
У вас должна быть информация о вашем представлении в вашей 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>