WPF学习笔记(15)数据网格控件DataGrid与数据模板

发布于:2025-07-02 ⋅ 阅读:(23) ⋅ 点赞:(0)


一、DataGrid

1. DataGrid类概述

DataGrid用于在网格中显示可编辑数据的控件。
官方文档:https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.controls.datagrid?view=netframework-4.8

在这里插入图片描述

2. ItemsControl类

ItemsControl类是列表ListBox、下拉框ComboBox、菜单、网格DataGrid等一系列选项的基类,部分属性如下:

属性 说 明
ltemsSource 获取或设置用于生成 ltemsControl 的内容的集合。
设置ltemsSource属性后,集合ltems是只读且固定大小的,因此不可修改。
ltems 获取用于生成 ltemsControl 的内容的集合。
DisplayMemberPath 获取或设置源对象上的值的路径,以用作对象的可视表示形式,不能同时设置 DisplayMemberPath 和ltemTemplate.
ItemTemplate 获取或设置用来显示每个项的数据模板DataTemplate。
ltemContainerStyle 获取或设置应用于为每个项生成的容器元素的 Style。

3. Selector类

Selector类允许用户从其元素中选择项的控件。部分属性和事件如下:

属性 说 明
SelectedIndex 获取或设置当前选择中第一项的索引,如果选择为空返回-1。
Selectedltem 获取或设置当前选择中的第一项,如果选择为空返回 null。
SelectedValue 获取或设置当前选择中的第一项的某个成员值。
SelectedValuePath 通常与 SelectedValue 属性一起使用,用于指定控件中选定项目的属性。
事件 说 明
Selected 当选择项时发生。
SelectionChanged 当选择更改时发生。
UnSelected 当取消选择项时发生。

3. DataGrid类

DataGrid类部分属性和事件如下:

属性 说 明
Columns 获取一个集合,该集合包含 DataGrid 中的所有列。
AutoGenerateColumns 获取或设置一个值,该值指示是否自动创建列,默认值为 True
AlternatingRowBackground 获取或设置间隔使用的背景画笔。
CanUserAddRows 获取或设置一个值,该值指示用户是否可添加新行,默认为True要出现空白行还需要保证自定义对象需要具有无参的构造函数
Currentltem 获取与包含当前单元格的行绑定的数据项。
SelectionUnit 获取或设置一个值,该值指示是否选择行、单元格或两者。
Cell只可选择单元格。
CellOrRowHeader 单击单元格时只选择该单元格,单击行标题选择整行。
FullRow只可选择整行。
SelectionMode 获取或设置单选还是多选。
Single 单选
Extended多选
IsReadOnly 获取或设置一个值,该值指示是否可编辑。

4. DataGridColumn类

DataGridColumn 类表示一个 DataGrid 列的抽象基类,部分属性和事件如下:

属性 说 明
Width 获取或设置列的宽度。Header
HeaderStringFormat 获取或设置要应用于列标题的格式,
HeaderTemplate 获取或设置用于显示列标题的数据模板
HeaderTemplateSelector 获取或设置标题列的数据模板选择器。
Visibility 获取或设置列是否显示
IsReadOnly 获取或设置一个值,该值指示能否编辑列中的单元格。
SortDirection 获取或设置列的排序方向(升序或降序)。

5. DataGridColumn类的派生类

DataGridBoundColumn类 表示一个可绑定到 DataGrid 的数据源中的属性的列的基类。

属性 说 明
Binding 获取或设置列的标题。

DataGridTextcolumn类继承自DataGridBoundcolumn,表示一个文本列。

属性 说 明
FontSize 获取或设置字体大小。
FontFamily 获取或设置字体。
Foreground 获取或设置前景色。

DataGridCheckBoxColumn类继承自DataGridBoundcolumn。表示一个复选框列。

属性 说 明
IsThreeState 获取或设置是否是三态复选框。

6. 实例

在这里插入图片描述

<Grid>
    <DataGrid x:Name="dataGrid" AlternatingRowBackground="Red" Margin="210,35,160,100"
              AutoGenerateColumns="False"
              CanUserAddRows="True"
              SelectionMode="Extended">
        <DataGrid.Columns>
            <DataGridTextColumn Header="学号" Width="100" Binding="{Binding Id}" />
            <DataGridTextColumn Header="姓名" Width="Auto" Binding="{Binding Name}" />
            <DataGridTextColumn Header="分数" Width="*" Binding="{Binding Score}" />
        </DataGrid.Columns>
   </DataGrid>
</Grid>
public class Stu
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Score { get; set; }
    //空的构造函数
    //如果没有空的构造函数,搭配CanUserAddRows使用时空白行无法产生
    public Stu() { }
    public Stu(int id, string name, int score)
    {
        Id = id;
        Name = name;
        Score = score;
    }
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<Stu> list = new List<Stu>
        {
            new Stu(1, "张三", 99),
            new Stu(2, "李四", 80),
            new Stu(3, "王五", 75)
        };
        dataGrid.ItemsSource = list;

        dataGrid.SelectionChanged += dataGrid_SelectionChanged;
    }

    private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        // 获取选中的项
        Stu s = dataGrid.SelectedItem as Stu;
        if (s != null)
        {
            // 访问第一列的数据
            Console.WriteLine(s.Id + "," + s.Name + "," + s.Score);
            Console.WriteLine("_______________________");
        }

        // 遍历访问每一列的数据
        foreach (object item in dataGrid.SelectedItems) 
        { 
            Stu stu = (Stu)item;
            Console.WriteLine(stu.Id + "." + stu.Name + "," + stu.Score);
        }
    }
}

在这里插入图片描述

二、DataGrid数据模板

DataGridColumn 类表示一个 设置DataTemplate的列, HeaderTemplate 用来获取或设置用于显示列标题的数据模板,HeaderTemplateSelector 用来获取或设置标题列的数据模板选择器。
通过在MainWindow.xaml界面的window.resources 定义数据模板,然后使用DataGrid类继承的ItemTemplate属性引用,示例代码如下:

<Window.Resources>
    <DataTemplate x:Key="myDT">
        <TextBlock Text="{Binding Id}" Width="30" Height="30" TextAlignment="Center" Background="Yellow" >
            <TextBlock.Clip>
                <EllipseGeometry Center="15,15" RadiusX="15" RadiusY="15" />
            </TextBlock.Clip></TextBlock>
        </DataTemplate>
</Window.Resources>
<Grid>
    <!--d:ItemsSource="{d:SampleData ItemCount=5}"仅在设计界面显示-->
    <DataGrid x:Name="dataGrid" d:ItemsSource="{d:SampleData ItemCount=5}"
              AutoGenerateColumns="False" AlternatingRowBackground="Red">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="学号" Width="100" CellTemplate="{StaticResource myDT}" />
            <DataGridTextColumn Header="姓名" Width="Auto" Binding="{Binding Name}" />
            <DataGridTextColumn Header="分数" Width="*" Binding="{Binding Score}" />
            </DataGrid.Columns>
    </DataGrid>
</Grid>
public class Stu
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Score { get; set; }
    //空的构造函数
    //如果没有空的构造函数,空白行无法产生,搭配CanUserAddRows使用
    public Stu() { }
    public Stu(int id, string name, int score)
    {
        Id = id;
        Name = name;
        Score = score;
    }
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<Stu> list = new List<Stu>
        {
            new Stu(1, "张三", 99),
            new Stu(2, "李四", 80),
            new Stu(3, "王五", 75)
        };
        dataGrid.ItemsSource = list;           
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到