2

我想在我的数据网格的每一行中添加一个图标。这些列是自动生成的,我添加了一个带有 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 列的值为“真”,则图标 1,如果值为“假”,则图标 2。

我可以使用数据网格中的 loadingrow 事件来执行此操作吗?如何使用 mvvm 执行此操作?还是有其他方法可以做这样的事情?

4

3 回答 3

3

这里最简单的做法是在 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 和字符串索引器,因此对于您的绑定路径,您可以使用[]列索引 ( [3]) 或列名 ( [MyColumn])。

于 2013-02-01T15:46:31.170 回答
2

这听起来像是转换器的工作。只需将 Image 的 Source-property 绑定到所需的 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>
于 2013-02-01T12:56:20.093 回答
0

我相信最好的方法是实现一个 IValueConverter。如果 column11 为真,则显示一张图像,如果为假,则显示另一张图像。

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;
     }
  }
}
于 2013-02-01T12:56:12.490 回答