在条件下显示XAML

本文关键字:XAML 显示 条件下 | 更新日期: 2023-09-27 18:00:43

上下文是我有一个Listbox,它输出的项目有很多样式(比我在这里放的更多)。。。我使用DataTemplateSelector根据某个条件显示一个或另一个图像,但只有这一个差异就必须重写整个模板是愚蠢的。

我放置了一些伪代码来演示我试图实现的目标:

<ListBox Grid.Row="1"
            ItemsSource="{Binding TestCases}"
            BorderThickness="0"
            HorizontalAlignment="Stretch"
            HorizontalContentAlignment="Stretch">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid HorizontalAlignment="Stretch">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"></ColumnDefinition>
                    <ColumnDefinition Width="auto"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0"
                            Padding="0,5,0,5">
                    <Run Text="{Binding Class}"></Run>
                </TextBlock>
                <TextBlock Grid.Column="1"
                            Padding="5">
                    <Run Text="{Binding Assertions}"></Run>
                </TextBlock>
if {Binding Failures} > 0 {
    <Image HorizontalAlignment="Center"
            Width="10"
            Height="10"
            Grid.Column="2"
            Source="/Content/Images/Cross.png">
    </Image>
}
else
{
    <Image HorizontalAlignment="Center"
            Width="10"
            Height="10"
            Grid.Column="2"
            Source="/Content/Images/Tick.png">
    </Image>
}
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

有什么想法吗?

-------------编辑---------------

到目前为止,我已经将转换器类的名称空间添加到XAML文件中:

xmlns:converters="clr-namespace:Blah.Blah.Converters"

然后添加窗口资源:

<Window.Resources>
    <converters:FailuresTickConverter x:Key="failuresTickConverter" />
    <converters:FailuresCrossConverter x:Key="failuresCrossConverter" />
</Window.Resources>

然后我有课程本身:

namespace Blah.Blah.Converters
{
    public class FailuresTickConverter : IValueConverter
    {
        public object Convert( object value, Type targetType,
            object parameter, CultureInfo culture )
        {
            int failures = (int)value;
            if( failures > 0 )
                return Visibility.Hidden;
            return Visibility.Visible;
        }
        public object ConvertBack( object value, Type targetType,
            object parameter, CultureInfo culture )
        {
            throw new NotImplementedException();
        }
    }
    public class FailuresCrossConverter : IValueConverter
    {
        public object Convert( object value, Type targetType,
            object parameter, CultureInfo culture )
        {
            int failures = ( int )value;
            if( failures > 0 )
                return Visibility.Visible;
            return Visibility.Hidden;
        }
        public object ConvertBack( object value, Type targetType,
            object parameter, CultureInfo culture )
        {
            throw new NotImplementedException();
        }
    }
}

然后在我的XAML图像上,我做了这样的操作:

<Image Visibility="{Binding Failures, Converter=failuresTickConverter}"
        HorizontalAlignment="Center"
        Width="10"
        Height="10"
        Grid.Column="2"
        Grid.Row="0"
        Source="/Content/Images/Tick.png">
</Image>
<Image Visibility="{Binding Failures, Converter=failuresCrossConverter}"
        HorizontalAlignment="Center"
        Width="10"
        Height="10"
        Grid.Column="2"
        Grid.Row="0"
        Source="/Content/Images/Cross.png">
</Image>

我在绑定上遇到一个错误:

IValueConverter不支持从字符串转换

在条件下显示XAML

详细阐述我的评论,这里有一个简单的(当然不是唯一的)方法:

创建一个转换器,将数字转换为可见性:

public class PositiveToVisibilityConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (int)value > 0 ? Visibility.Visible : Visibility.Collapsed;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

将转换器的命名空间添加到xaml中,将转换器添加到资源中(当然,使用您自己的命名空间):

<Window ...
        xmlns:converters="clr-namespace:WpfApplication1.Converters"
        ...>
    <Window.Resources>
        <converters:PositiveToVisibilityConverter x:Key="PositiveConverter"/>
    </Window.Resources>

然后将两个图像都放在"成功"的图像中,并使用转换器将属性绑定到"失败"的图像:

<Image HorizontalAlignment="Center"
        Width="10"
        Height="10"
        Grid.Column="2"
        Source="/Content/Images/Tick.png"
        Visibility="{Binding Failures, Converter={StaticResource PositiveConverter}}">
</Image>
<Image HorizontalAlignment="Center"
        Width="10"
        Height="10"
        Grid.Column="2"
        Source="/Content/Images/Cross.png">
</Image>

由于这些图像在网格中(我假设),并且具有相同的位置和大小,它们将重叠,通常最后定义的图像将绘制在最后,因此第一个图像将不可见。也就是说,除非绑定使第二个图像不可见。