惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
U
Unit 42
N
Netflix TechBlog - Medium
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
小众软件
小众软件
V
Visual Studio Blog
T
Tailwind CSS Blog
Engineering at Meta
Engineering at Meta
博客园 - 叶小钗
GbyAI
GbyAI
爱范儿
爱范儿
雷峰网
雷峰网
Microsoft Azure Blog
Microsoft Azure Blog
D
DataBreaches.Net
博客园_首页
D
Docker
A
About on SuperTechFans
G
Google Developers Blog
I
InfoQ
T
The Blog of Author Tim Ferriss
V
V2EX
博客园 - Franky

博客园 - seabluescn

WPF开发快速入门【8】WPF进行简单的3D开发 WPF开发快速入门【7】WPF的拖放功能(Drag and Drop) WPF开发快速入门【6】下拉框与枚举类型 WPF开发快速入门【4】自定义控件与用户控件 WPF开发快速入门【3】WPF的基本特性(附加属性) WPF开发快速入门【2】WPF的基本特性(Style、Trigger、Template) WPF开发快速入门【1】WPF的布局 WPF开发快速入门【0】前言与目录 WPF优秀组件推荐之FreeSpire WPF优秀组件推荐之LiveCharts WPF优秀组件推荐之MahApps WPF优秀组件推荐之Stylet(二) WPF优秀组件推荐之Stylet(一) TensorFlow.NET机器学习入门【9】后记 TensorFlow.NET机器学习入门【8】采用GPU进行学习 TensorFlow.NET机器学习入门【7】采用卷积神经网络(CNN)处理Fashion-MNIST TensorFlow.NET机器学习入门【6】采用神经网络处理Fashion-MNIST TensorFlow.NET机器学习入门【5】采用神经网络实现手写数字识别(MNIST) TensorFlow.NET机器学习入门【4】采用神经网络处理分类问题
WPF开发快速入门【5】DataGrid的使用
seabluescn · 2022-08-23 · via 博客园 - seabluescn

概述

DataGrid是最常用的一种列表数据展现控件,本文介绍DataGrid的一些常用操作,包括:展示、新增、删除、修改等。以下代码基于Stylet框架实现。

数据展示

DataGrid用于对象列表的展示,我们先定义一个对象DataRecord

    public class DataRecord
    {
        public bool IsChecked { get; set; }
        public DateTime Time { get; set; }
        public string Title { get; set; }
        public RecordType RecordType { get; set; }
        public string ImagePath => RecordType == RecordType.File ? "/Images/File.png" : "/Images/Folder.png";
        public double Size { get; set; }
        public bool IsTooLarger => Size > 100;
        public object Tag { get; set; }
        public override string ToString()
        {
            return Title;
        }
    }

 后台我们要建两个对象,一个是DataRecord的列表,一个是被选中的DataRecord对象。

public class PageDataGridViewModel : Screen
    {
        protected override void OnInitialActivate()
        {
            base.OnInitialActivate();
            InitList();
        }

        public BindableCollection<DataRecord> DataRecordList { get; set; }
        public DataRecord SelectedDataRecord { get; set; } 
    }

注意DataRecordList 的类型为BindableCollection<DataRecord> 而不是List<DataRecord>,BindableCollection类是Stylet框架自带的一个列表类型,当用户在操作该控件时,它会发NotifyOfPropertyChange事件给View端。

InitList代码如下:

      private void InitList()
        {
            DataRecordList = new BindableCollection<DataRecord>()
            {
                new DataRecord()
                {
                    Title="Hello",
                    Size=10,
                    RecordType= RecordType.Folder
                },
                new DataRecord()
                {
                    Title="World",
                    Size=100.122323232,
                    RecordType= RecordType.Folder
                },
                new DataRecord()
                {
                    Title="Hehe",
                    Size=200,
                    RecordType= RecordType.File,
                    IsChecked=true
                }
            };
        }

View Code

设计端代码如下:

               <DataGrid  AutoGenerateColumns="False"
                          ItemsSource="{Binding DataRecordList}"
                          SelectedItem="{Binding SelectedDataRecord}">
                    <DataGrid.Columns>                        
                        <DataGridTextColumn Width="150" Header="Reocrd Time" Binding="{Binding Time,StringFormat='yyyy-MM-dd HH:mm:ss'}" IsReadOnly="True"/>
                        <DataGridTextColumn Width="150" Header="Title" Binding="{Binding Title}"/>             
                    </DataGrid.Columns>
                </DataGrid>

 这样,一个简单的列表就完成了。

新增、删除、修改

        public void AddNew()
        {
            DataRecordList.Add(new DataRecord()
            {
                Time = DateTime.Now,
                Title="New Item",
            });
        }

        public void Remove()
        {
            DataRecordList.Remove(SelectedDataRecord);
        }       

        public void Update()
        {
            SelectedDataRecord.Title = "Updated";
            SelectedDataRecord.Time = DateTime.Now;
            DataRecordList.Refresh();           
        }

 当新增或删除数据时,前端会直接变化,如果是修改数据,需要人为调用BindableCollection类的Refresh()方法。

一些常用操作

1、通过数据控制字段显示样式

                        <DataGridTextColumn Width="80" Header="Size" Binding="{Binding Size,StringFormat='0.00'}">
                            <DataGridTextColumn.CellStyle>
                                <Style  TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource MahApps.Styles.DataGridCell}">
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding IsTooLarger}" Value="True">
                                            <Setter Property="Foreground" Value="Red" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </DataGridTextColumn.CellStyle>
                        </DataGridTextColumn>

2、通过数据模板显示图片

                        <DataGridTemplateColumn Width="30">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <Image Source="{Binding ImagePath}" Width="25" Height="25" Margin="2"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>

3、通过数据模板显示CheckBox

                        <DataGridTemplateColumn Header="">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <CheckBox IsChecked="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}" />
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>

当用户修改了CheckBox状态后,后台也能读取到选中的状态。

4、显示下拉框

<DataGridComboBoxColumn Header="Type" Width="80" 
              SelectedItemBinding="{Binding RecordType}"
              ItemsSource="{Binding Source={StaticResource RecordTypeEnumKey}}" />

资源

系列目录:WPF开发快速入门【0】前言与目录 

代码下载:Learn WPF: WPF学习笔记 (gitee.com)