基于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
相关产品推荐
相关产品推荐

