Как условно форматировать WPF TextBlock?
У меня есть текстовый блок WPF, привязанный к строке.
Если эта строка пуста, я хочу, чтобы TextBlock отображал предупреждающее сообщение в другом цвете.
Это легко сделать в коде, мне было интересно, было ли для него элегантное WPF-решение XAML WPF?
Я исследовал триггеры стиля, но синтаксис для меня не стал естественным.
Спасибо!
Ответы
Ответ 1
Добавление некоторых деталей в Даниэль (слегка короткий) ответ, поскольку некоторые из необходимых данных DataTrigger на самом деле не тривиальны (например, {x:Null}
):
<TextBlock Text="{Binding MyTextProperty}">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding MyTextProperty}" Value="{x:Null}">
<Setter Property="Text" Value="Hey, the text should not be empty!"/>
<Setter Property="Foreground" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
BTW: Это полностью из памяти, не проверял его в VS или Blend, поэтому, пожалуйста, извините, если там есть ошибки. Однако вы должны быть в состоянии разобраться в себе. То, что считается идеей. Удачи!
Ответ 2
Вы можете использовать Конвертер для этого. Просто создайте класс с IValueConverter. После этого в dataBinding используйте этот конвертер
Например, ваш XAML
<Window x:Class="WpfApplication4.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:lib="clr-namespace:WpfApplication4"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<lib:TextBlockDataConveter x:Key="DataConverter"/>
<lib:TextBlockForegroundConverter x:Key="ColorConverter"/>
</Window.Resources>
<Grid>
<TextBlock Text="{Binding Path=message, Converter ={StaticResource DataConverter}}" Foreground="{Binding message, Converter={StaticResource ColorConverter}}"/>
</Grid>
и ваши преобразователи:
public class TextBlockDataConveter:IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
{
return "Error Message";
}
else
{
return value;
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
class TextBlockForegroundConverter:IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
{
SolidColorBrush brush = new SolidColorBrush();
brush.Color = Colors.Red;
return brush;
}
else
{
SolidColorBrush brush = new SolidColorBrush();
brush.Color = Colors.Black;
return brush;
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
он работает. Проверьте его.