在WPF数据网格中添加图标

在WPF数据网格中添加图标,wpf,xaml,datagrid,icons,Wpf,Xaml,Datagrid,Icons,我想在datagrid的每一行中添加一个图标。这些列是自动生成的,我添加了一个带有datagridtemplatecolumn的列,以在第一列中显示一个图标 这是我显示图标的xaml代码: <DataGrid ItemsSource="{Binding User.myDataTable}" IsReadOnly="True" FrozenColumnCount="1"> <DataGrid.Columns> <Data

我想在datagrid的每一行中添加一个图标。这些列是自动生成的,我添加了一个带有datagridtemplatecolumn的列,以在第一列中显示一个图标

这是我显示图标的xaml代码:

    <DataGrid ItemsSource="{Binding User.myDataTable}" IsReadOnly="True" FrozenColumnCount="1">
        <DataGrid.Columns>
            <DataGridTemplateColumn x:Name="IconHeader"  Header="" CanUserResize="False">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Image Source="myImage" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

这很有效。 现在,如果行的一列中有一个条件为true,我想更改图标。 例如如果第11列的值为“真”,则为图标1;如果值为“假”,则为图标2


我可以使用datagrid中的loadingrow事件来执行此操作吗?如何使用mvvm执行此操作?或者还有其他方法可以做到这一点吗?

我认为最好的方法是实现IValueConverter。如果第11列为真,则显示一个图像,如果为假,则显示另一个图像

IValueConverter:

比如:

public class IconConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
     if ((bool)value == true)
     {
        // column11 = true, so show icon 1
        return image1;
     }
     else
     {
        return image2;
     }
  }
}

这听起来像是转换器的工作。只需将图像的源属性绑定到所需的属性:

<Image Source="{Binding Path=BoolProp, Converter={StaticResource BoolToImageConv}}"
在Window/UserControl的资源中,您必须引用转换器

<Window.Resources>
    <conv:BoolToImageConverter FalsePath="pathforimageiffalse" TruePath="pathforimageiftrue" x:Key="BoolToImageConv"/>
</Window.Resources>

这里最简单的方法是在CellTemplate中使用DataTrigger,它将根据与列数据的绑定触发:

<DataTemplate>
    <Image Source="myImage1" x:Name="img" />
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=[11]}" Value="False">
            <Setter TargetName="img" Property="Source" Value="myImage2" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>


DataRow具有int和string索引器,用于按索引或名称获取列,因此对于绑定路径,您可以将
[]
与列索引(
[3]
)或列名(
[MyColumn]
)一起使用。

您能告诉我必须如何在窗口中添加xmlns名称空间吗?当然:
xmlns:conv=“clr命名空间:ApplicationName.FolderName”
如果它在另一个程序集中:
xmlns:conv=“clr命名空间:APApplicationName.FolderName;assembly=AssemblyName“
…但只需键入xmlns:conv=”和intellisense就可以完成其余工作^^^抱歉,我必须再次询问:我在文件夹转换器中添加了一个类BooltImageConverter。现在我已经添加到名称空间xmlns:conv=“clr namespace:WPF.Converter”,但conv:booltimageconverter不在名称空间中。怎么了?试着编译它,有时候VS调试器有点慢^^检查转换器的名称空间。它必须是
WPF.Converter
。如何绑定Column11属性?“我的列”是自动生成的。这是布尔属性的占位符,您要使用它来确定要使用的图像,因为您的问题没有显示任何数据。我的数据来自MSSQL Server的StoredProcess。在我的模型中,我有一个由StoredProcess填充的数据表,该数据表绑定到datagrid的itemssource。因此,我不知道如何在映像1和映像2之间为DataRow更新绑定路径。
<DataTemplate>
    <Image Source="myImage1" x:Name="img" />
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=[11]}" Value="False">
            <Setter TargetName="img" Property="Source" Value="myImage2" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>