WPF学习笔记(14)列表视图控件ListView与数据模板

发布于:2025-07-01 ⋅ 阅读:(18) ⋅ 点赞:(0)


一、ListView

1. ListView概述

ListView继承与ListBox,也是一个用于显示的控件。
官方文档:https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.controls.listview?view=netframework-4.8
在这里插入图片描述

2. ItemsControl类

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

左对齐
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 当取消选择项时发生。

4. ListBox类

ListBox类的部分属性与事件如下:
|属性|说 明 |

左对齐
Selectedltems 取当前所有选择的项。
SelectionMode 获取或设置 ListBox 的选择行为。
Single 用户一次只能选择一项。
Multiple 用户可选择多个项而无需按下修改键(Shift、Ctr等)。
Extended 用户可在按住 SHIFT 键的同时选择多个连续项目或按住Ctr 键并单击项目来选择非连续项。
    <Grid>
        <ListView x:Name="listView" Margin="175,83,230,125">
            <system:String>高等数学</system:String>
            <ContentControl>线性代数</ContentControl>
            <ListViewItem>数率统计</ListViewItem>
            <Rectangle Fill="Red" Width="100" Height="20"/>
        </ListView>
    </Grid>

5. ListView类

ListView类可以使用ListBox的所有功能,示例代码如上,其部分属性如下:

属性 说 明
View 获取或设置一个对象,用于定义如何在 ListView 控件中设置数据样式和组织数据

在这里插入图片描述

6. GridView类

GridView类是一种视图模式,用于显示列和行的数据。
GridView不是控件,不能单独使用,而需要与父级控件(如ListView)结合使用。
官方文档:https://learn.microsoft.com/zh-cn/dotnet/api/system.web.ui.webcontrols.gridview?view=netframework-4.8
在这里插入图片描述
GridView类的部分属性如下:

属性 说 明
Header 获取或设置 列的标题。
HeaderStringFormat 获取或设置标题字符串的格式。
Width 获取或设置列的宽度。
DisplayMemberBinding 获取或设置要为此列绑定到的数据项
CellTemplate 获取或设置用于显示列单元格内容的数据模板
CellTemplateSelector 获取或设置单元格内容的数据模板选择器
HeaderTemplate 获取或设置用于显示列标题的数据模板
HeaderTemplateSelector 获取或设置标题列的数据模板选择器

示例代码和运行结果如下:

<Grid>
    <ListView x:Name="listView" HorizontalAlignment="Left" Height="260" Width="400"  Margin="200,100,0,0">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" Width="100" DisplayMemberBinding="{Binding Id}" />
                <GridViewColumn Header="姓名" Width="200" DisplayMemberBinding="{Binding Name}" />
                <GridViewColumn Header="分数" Width="Auto" DisplayMemberBinding="{Binding Score }" />
            </GridView>
        </ListView.View>
    </ListView>
</Grid>
public class Stu
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Score { get; set; }
    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, "张三", 100),
            new Stu(2, "李四", 80),
            new Stu(3, "王五", 75)
        };

        listView.ItemsSource = list;

        listView.SelectionChanged += listView_SelectionChanged;
    }

    private void listView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        // 获取选中的项, as为强制转换
        Stu s = listView.SelectedItem as Stu;
        if (s != null)
        {
            // 访问一列的数据
            Console.WriteLine(s.Id + "," + s.Name + "," + s.Score);
            Console.WriteLine("--------------------------------------");
        }

        // 遍历访问所有选中列的数据
        foreach (object item in listView.SelectedItems)
        {
            Stu stu = (Stu)item;
            Console.WriteLine(stu.Id + "," + stu.Name + "," + stu.Score);
        }

    }
}

在这里插入图片描述

二、ListView数据模板

ItemsControl类的ItemTemplate用来获取或设置用来显示每个项的数据模板DataTemplate

GridViewCoulmn类:

  • CellTemplate用来获取或设置用于显示列单元格内容的数据模板
  • CellTemplateSelector 获取或设置单元格内容的数据模板选择器
  • HeaderTemplate 获取或设置用于显示列标题的数据模板
  • HeaderTemplateSelector 获取或设置标题列的数据模板选择器

示例代码如下:

<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>
    <ListView x:Name="listView" HorizontalAlignment="Center" Height="260" Width="435" d:ItemsSource="{d:SampleData ItemCount=5}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" Width="100" CellTemplate="{StaticResource myDT}" />
                <GridViewColumn Header="姓名" Width="200" DisplayMemberBinding="{Binding Name}" />
                <GridViewColumn Header="分数" Width="Auto" DisplayMemberBinding="{Binding Score }" />
            </GridView>
        </ListView.View>
    </ListView>
</Grid>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<Stu> list = new List<Stu>
        {
            new Stu(1, "张三", 100),
            new Stu(2, "李四", 80),
            new Stu(3, "王五", 75)
        };
        listView.ItemsSource = list;
    }
}
public class Stu
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Score { get; set; }
    public Stu(int id, string name, int score)
    {
        Id = id;
        Name = name;
        Score = score;
    }
}

总结

  • ListView是ListBox的子类,继承了所有父类的属性
  • 使用GridViewCoulmn的属性设置相应内容的数据模板

网站公告

今日签到

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