You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF DataGrid自动生成列时如何正确显示PackIcon图标?

解决WPF DataGrid自动生成列时PackIcon无法显示的问题

当DataGrid自动生成列时,MaterialDesignThemes.Wpf.PackIcon类型的属性会默认生成DataGridTextColumn,从而显示类型名称而非实际图标。要解决这个问题,你需要在AutoGeneratingColumn事件中拦截该类型的列,将其替换为DataGridTemplateColumn,并在模板中直接使用PackIcon控件绑定数据源。

步骤1:在XAML中配置DataGrid并绑定事件

<DataGrid x:Name="MyDataGrid" 
          AutoGenerateColumns="True" 
          ItemsSource="{Binding MyDataTable}"
          AutoGeneratingColumn="MyDataGrid_AutoGeneratingColumn"/>

步骤2:后台处理AutoGeneratingColumn事件

在窗口/用户控件的代码后台添加事件处理逻辑,判断当前生成列的绑定类型是否为PackIcon,如果是则替换为模板列:

private void MyDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    // 检查当前列对应的数据源类型是否为PackIcon
    if (e.PropertyType == typeof(MaterialDesignThemes.Wpf.PackIcon))
    {
        // 取消默认生成的列
        e.Cancel = true;

        // 创建模板列
        var templateColumn = new DataGridTemplateColumn
        {
            Header = e.Column.Header,
            CellTemplate = new DataTemplate()
        };

        // 创建PackIcon控件并设置绑定
        var packIconFactory = new FrameworkElementFactory(typeof(MaterialDesignThemes.Wpf.PackIcon));
        // 绑定PackIcon的Kind属性(假设数据源中PackIcon对象已设置Kind)
        packIconFactory.SetBinding(MaterialDesignThemes.Wpf.PackIcon.KindProperty, new Binding(e.PropertyName));
        // 可按需设置图标大小、颜色
        packIconFactory.SetValue(MaterialDesignThemes.Wpf.PackIcon.WidthProperty, 24.0);
        packIconFactory.SetValue(MaterialDesignThemes.Wpf.PackIcon.HeightProperty, 24.0);
        packIconFactory.SetValue(MaterialDesignThemes.Wpf.PackIcon.ForegroundProperty, Brushes.Black);

        templateColumn.CellTemplate.VisualTree = packIconFactory;
        // 将模板列添加到DataGrid
        ((DataGrid)sender).Columns.Add(templateColumn);
    }
}

步骤3:确保ViewModel中DataTable的列类型正确

创建DataTable时,要明确指定Icon列的类型为PackIcon,避免类型推断错误:

var dataTable = new DataTable();
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("BooleanValue", typeof(bool));
// 明确指定Icon列类型为PackIcon
dataTable.Columns.Add("Icon", typeof(MaterialDesignThemes.Wpf.PackIcon));

// 添加示例数据
dataTable.Rows.Add("示例1", true, new PackIcon { Kind = PackIconKind.Check });
dataTable.Rows.Add("示例2", false, new PackIcon { Kind = PackIconKind.Close });

MyDataTable = dataTable;

注意事项

  • 如果数据源中存储的是PackIconKind枚举值而非PackIcon对象,只需把列类型判断改为typeof(PackIconKind),并保持PackIcon.KindProperty的绑定即可。
  • 可根据需求动态绑定PackIcon的大小、颜色等属性,比如绑定到数据源中的其他字段来实现样式定制。

内容的提问来源于stack exchange,提问作者Enki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:10:50