如何根据绑定值更改WPF数据表格行的图像

3

我是WPF的初学者。

我有一个数据表格用于显示消息,其列定义如下。数据网格绑定到一个数据表

<my:DataGridTextColumn Binding="{Binding Module}" Header="Module" 
    Width="75" IsReadOnly="True"></my:DataGridTextColumn>
<my:DataGridTextColumn Binding="{Binding Record ID}" Header="RecordID" 
    Width="75" IsReadOnly="True"></my:DataGridTextColumn>
<my:DataGridTextColumn Binding="{Binding ItemName}" 
    Header="Item/Platform/Country Name" Width="175" IsReadOnly="True">  
    </my:DataGridTextColumn>
<my:DataGridTextColumn Binding="{Binding DateReceived}" 
    Header="DateReceived" Width="150" IsReadOnly="True">
    </my:DataGridTextColumn>
<my:DataGridTextColumn Binding="{Binding Comments}" Header="Comments" 
    Width="300" IsReadOnly="True"></my:DataGridTextColumn>

现在我需要添加一个标题为“状态”的列,并将内容设置为图像。我将数据表的“IsRead”列绑定到此列,以便如果IsRead值为False,则需要显示未读图像unread.png,如果IsRead值为True,则需要显示已读图像read.png。
如何实现这一点?
1个回答

11

你可以在保存绑定属性的类中创建一个StatusImage属性:

public string StatusImage {
    get 
    {
        if (IsRead)
            return "read.png";
        return "unread.png";
    }
}

然后将其绑定到图像上,例如:

<Image Source="{Binding StatusImage}"></Image>

或者像你的情况一样,你没有一个类。你可以在数据触发器之间进行选择:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Image Name="IsReadImage" Source="read.png"/>
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding IsRead}" Value="False">
                    <Setter TargetName="IsReadImage" Property="Source" Value="unread.png"/>
                </DataTrigger>             
            </DataTemplate.Triggers>         
        </DataTemplate>     
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn>

或者你可以使用值转换器:

类:

public class IsReadImageConverter : IValueConverter  
{
    public Image ReadImage { get; set; }
    public Image UnreadImage { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (!(value is bool))
        {
            return null;
        }
        bool b = (bool)value;
        if (b)
        {
            return this.ReadImage
        }
        else
        {
            return this.UnreadImage
        }
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

窗口资源:

<local:IsReadImageConverter ReadImage="Read.png" UnreadImage="Unread.png" x:Key="BoolImageConverter"/>

那么您的绑定将是:

ImageSource={Binding Path=IsRead,Converter={StaticResource BoolImageConverter}}"

应该都正常工作。


IsRead在那个类中未定义,对吧?IsRead是一个数据表列。 - Kuntady Nithesh
那么ItemName、Module、DateReceived等属性是在哪里指定的呢?它们是从一个类中获取的,对吧? - Daniel Olsen
我在上面的回复中添加了一个DataTrigger解决方案和一个ValueConverter解决方案。其中之一应该适合您的需求。 - Daniel Olsen
当我尝试使用ValueConverter时,出现错误提示说ReadImage是一个图像类型,无法将字符串赋值给它。 - Will Marcouiller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接