如何在 WPF 应用程序中正确添加带有图像单元格的 GridViewColumn

How to add GridViewColumn with image cells properly in WPF app

如果我只添加字符串值列 - 一切正常:

gridView.Columns.Add(new GridViewColumn
{
    Header = "ExecFileName",
    DisplayMemberBinding = new Binding("ExecFileName")
});

但是我如何在该列的单元格中添加具有 BitmapImage 或 ImageSource 值的列?

无论我做什么 - 我总是只能看到图像文件的路径 - 如何显示图像本身?

P.S.: 我正在从代码创建 GridView,在 xaml 我只有:

<ListView x:Name="ResultListView" 
          BorderThickness="2,0,2,0" 
          BorderBrush="Gray" 
          Height="Auto" 
          Width="Auto" 
          Margin="0,0,0,10" 
          RenderTransformOrigin="0.502,2.299" 
          AutomationProperties.IsColumnHeader="True" 
          Loaded="ResultListView_Loaded" 
          MouseDoubleClick="ResultListView_MouseDoubleClick" >
</ListView>

由于您是在代码隐藏中创建 GridView,因此您还需要在代码隐藏中创建到 ImageSource/BitmapSource 的绑定。

这是生成此列​​表视图的示例:

MainWindow.xaml 文件是:

<Window x:Class="WpfApplication6.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication6"
        mc:Ignorable="d"
        Title="MainWindow" Height="150" Width="250"
        d:DataContext="{d:DesignData d:Type=local:MainWindow}">
    <Grid>
        <ListView x:Name="ResultListView" 
                  ItemsSource="{Binding Items}"
                  BorderThickness="2,0,2,0" 
                  BorderBrush="Gray" 
                  Height="Auto" 
                  Width="Auto" 
                  Margin="0,0,0,10" 
                  RenderTransformOrigin="0.502,2.299" 
                  AutomationProperties.IsColumnHeader="True">
        </ListView>
    </Grid>
</Window>

隐藏代码是这样的(MainWindow.xaml.cs):

using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media.Imaging;

namespace WpfApplication6
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public ObservableCollection<Item> Items { get; } = new ObservableCollection<Item>(new[]
        {
            new Item { ExecFileName = @"C:\Temp\icon1.png" },
            new Item { ExecFileName = @"C:\Temp\icon2.png" }
        });

        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;

            FrameworkElementFactory factory = new FrameworkElementFactory(typeof(Image));
            factory.SetBinding(Image.SourceProperty, new Binding("ImageSource"));

            GridView gridView = new GridView();
            gridView.Columns.Add(new GridViewColumn
            {
                Header = "FileName",
                DisplayMemberBinding = new Binding("ExecFileName")
            });
            gridView.Columns.Add(new GridViewColumn
            {
                Header = "Image",
                CellTemplate = new DataTemplate() { VisualTree = factory }
            });
            ResultListView.View = gridView;
        }
    }

    public class Item
    {
        public string ExecFileName { get; set; }

        public BitmapImage ImageSource
        {
            get
            {
                return new BitmapImage(
                    new Uri(ExecFileName, UriKind.RelativeOrAbsolute));
            }
        }
    }
}

我只给出一个简短的答案 - 我的错误到底是什么:

我正在尝试像往常一样为字符串值单元格添加列:

            gridView.Columns.Add(new GridViewColumn
        {
            Header = "Icon",
            DisplayMemberBinding = new Binding("Icon")
        });

但我需要这样添加:

            FrameworkElementFactory factory = new FrameworkElementFactory(typeof(Image));
        factory.SetBinding(Image.SourceProperty, new Binding("Icon"));

        gridView.Columns.Add(new GridViewColumn
        {
            Header = "Icon",
            CellTemplate = new DataTemplate() { VisualTree = factory }
        });