在WPF数据网格中添加图标

时间:2013-02-01 12:41:54

标签: wpf xaml datagrid icons

我想在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>

运作良好。 现在我想更改图标,如果行的一列是条件为真。 例如。如果第11列的值为“true”,则为图标1,如果值为“false”,则为icon2。

我可以使用datagrid中的loadingrow事件来执行此操作吗?如何使用mvvm执行此操作?还是有另一种方法可以做这样的事情吗?

3 个答案:

答案 0 :(得分:1)

这里最简单的方法是使用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])或列名称({{ 1}})。

答案 1 :(得分:0)

我认为最好的方法是实现IValueConverter。如果column11为true,则显示一个图像,如果为false,则显示另一个图像。

IValueConverter:http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx

类似的东西:

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;
     }
  }
}

答案 2 :(得分:0)

这听起来像转换器的工作。只需将Image的Source-property绑定到所需的属性:

<Image Source="{Binding Path=BoolProp, Converter={StaticResource BoolToImageConv}}"

您的转换器可能看起来像

public class BoolToImageConverter:IValueConverter
{
    public string FalsePath { get; set; }
    public string TruePath { get; set; }
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (System.Convert.ToBoolean(value))
        {
            return new BitmapImage(new Uri(TruePath));
        }
        return new BitmapImage(new Uri(FalsePath));
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

在Window / UserControl的资源中,你必须参考你的转换器。

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