Как я условно форматирую WPF TextBlock?

Мне связали WPF TextBlock со строкой. Если та строка пуста, я хочу, чтобы TextBlock отобразил предупреждающее сообщение в другом цвете.

Это легко сделать в коде, я задавался вопросом, было ли изящное чистое решение XAML WPF для него? Я исследовал Триггеры Стиля, но синтаксис не прибывает естественно ко мне.

Спасибо!

17
задан Askolein 19 October 2016 в 14:29
поделиться

2 ответа

Добавление некоторых деталей к (немного короткий) ответ Дэниела , поскольку некоторые из необходимых материалов 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 , поэтому, пожалуйста, извините, если там есть ошибки. Однако вы должны суметь разобраться в них самостоятельно. Важна идея. Удачи!

25
ответ дан 30 November 2019 в 12:07
поделиться

Для этого вы можете использовать Конвертер. Просто создайте класс с 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
}

он работает. Проверь это.

9
ответ дан 30 November 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: