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

基于Material Design与.NET MVVM,如何在DataTable中用图标绑定DataGrid?

解决DataGrid中Material Design图标显示问题

要让DataTable中的PackIconKind枚举值在DataGrid里渲染成Material Design图标,核心是为对应列指定自定义DataTemplate,让WPF明确将枚举值转换为PackIcon控件。

步骤1:确认Material Design资源已正确引入

确保项目已引用Material Design in XAML库,并且在View的XAML头部添加命名空间:

xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"

同时在App.xaml的ResourceDictionary中引入主题资源:

<ResourceDictionary.MergedDictionaries>
    <materialDesign:BundledTheme BaseTheme="Light" PrimaryColor="DeepPurple" SecondaryColor="Lime" />
    <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
</ResourceDictionary.MergedDictionaries>

步骤2:ViewModel中构建带PackIconKind的DataTable

基于.NET Community Toolkit MVVM框架,ViewModel示例代码:

using System.Data;
using MaterialDesignThemes.Wpf;
using CommunityToolkit.Mvvm.ComponentModel;

public class MainViewModel : ObservableObject
{
    private DataTable _dataTable;
    public DataTable DataTable
    {
        get => _dataTable;
        set => SetProperty(ref _dataTable, value);
    }

    public MainViewModel()
    {
        InitializeDataTable();
    }

    private void InitializeDataTable()
    {
        DataTable = new DataTable();
        DataTable.Columns.Add("操作", typeof(PackIconKind));
        DataTable.Columns.Add("描述", typeof(string));

        // 添加测试数据
        DataTable.Rows.Add(PackIconKind.Printer, "打印文档");
        DataTable.Rows.Add(PackIconKind.FileExport, "导出数据");
    }
}

步骤3:View中为DataGrid图标列设置模板

在DataGrid的XAML中,为图标列使用DataGridTemplateColumn,直接绑定PackIcon的Kind属性:

<DataGrid ItemsSource="{Binding DataTable}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <!-- 图标列 -->
        <DataGridTemplateColumn Header="操作">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <materialDesign:PackIcon Kind="{Binding [操作]}" Width="24" Height="24" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <!-- 文本列 -->
        <DataGridTextColumn Header="描述" Binding="{Binding [描述]}" />
    </DataGrid.Columns>
</DataGrid>

补充:自动生成列时的处理

如果DataGrid设为AutoGenerateColumns="True",可以通过AutoGeneratingColumn事件替换默认列:

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.PropertyType == typeof(PackIconKind))
    {
        e.Column = new DataGridTemplateColumn
        {
            Header = e.Column.Header,
            CellTemplate = new DataTemplate
            {
                VisualTree = new FrameworkElementFactory(typeof(PackIcon))
                {
                    Setters =
                    {
                        new Setter(PackIcon.KindProperty, new Binding(e.PropertyName)),
                        new Setter(PackIcon.WidthProperty, 24.0),
                        new Setter(PackIcon.HeightProperty, 24.0)
                    }
                }
            }
        };
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:31:15