WPF学习笔记(13)列表框控件ListBox与数据模板

列表框控件ListBox与数据模板


一、ListBox

1. ListBox概述

ListBox代表一个可单选或多选的列表

官方文档:https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.controls.listbox?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 键并单击项目来选择非连续项。


示例代码1,列表显示字符串:

xml 复制代码
    <Grid>
        <!--d:仅在设计界面显示-->
        <ListBox x:Name="listBox" d:ItemsSource="{d:SampleData ItemCount=5}" SelectionMode="Multiple">
    </Grid>
csharp 复制代码
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<String> list = new List<String>();
        list.Add("高等数学");
        list.Add("线性代数");
        list.Add("数率统计");

        listBox.ItemsSource = list;

        listBox.SelectionChanged += listBox_SelectionChanged;
    }

    private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        Console.WriteLine("--------------------");

        // 遍历所选项并打印
        // 多选模式下listBox.SelectedItem; listBox.SelectedValue是第一个选择的值
        foreach (object item in listBox.SelectedItems)
        {
            Console.WriteLine(item.ToString());
        }
    }
}

示例代码2,列表为Stu类的对象:

csharp 复制代码
//创建学生类,包含ID, Name, Score三个属性
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)
        };

        listBox.ItemsSource = list;
        // 显示的字段,列表框界面上显示的是姓名
        listBox.DisplayMemberPath = "Name";

        //选择的值的字段,SelectedValue获取的值是分数
        listBox.SelectedValuePath = "Score";

        listBox.SelectionChanged += listBox_SelectionChanged;
    }

    private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        Console.WriteLine("--------------------");

        // 遍历所选项并打印
        // 多选模式下listBox.SelectedItem; listBox.SelectedValue是第一个选择的值
        foreach (object item in listBox.SelectedItems)
        {
            Stu stu = (Stu)item;
            Console.WriteLine(stu.Id +","+ stu.Name + "," + stu.Score);
        }
    }
}
xml 复制代码
    <Grid>
        <!--d:ItemsSource="{d:SampleData ItemCount=5}"仅在设计界面显示-->
        <ListBox x:Name="listBox" d:ItemsSource="{d:SampleData ItemCount=5}" SelectionMode="Multiple"
                 Height="300" Width="600"/>
    </Grid>

二、ListBox数据模板

通过在MainWindow.xaml界面的window.resources 定义数据模板,然后使用ListBox类继承的ItemTemplate属性引用,示例代码如下:

csharp 复制代码
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)
        };

        listBox.ItemsSource = list;

        listBox.SelectionChanged += listBox_SelectionChanged;
    }

    private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        Console.WriteLine("--------------------");

        // 遍历所选项并打印
        // 多选模式下listBox.SelectedItem; listBox.SelectedValue是第一个选择的值
        foreach (object item in listBox.SelectedItems)
        {
            Stu stu = (Stu)item;
            Console.WriteLine(stu.Id +","+ stu.Name + "," + stu.Score);
        }
    }
}
xml 复制代码
    <Window.Resources>
        <DataTemplate x:Key="myDT">
            <Border BorderBrush="Gray" BorderThickness="2">
            <StackPanel>
                <TextBlock Text="{Binding Path=Id}" Foreground="Red" />
                <TextBlock Text="{Binding Path=Name}" Foreground="Green" />
                <TextBlock Text="{Binding Path=Score}" Foreground="Blue" />
            </StackPanel>
            </Border>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <!--d:ItemsSource="{d:SampleData ItemCount=5}"仅在设计界面显示-->
        <ListBox x:Name="listBox" d:ItemsSource="{d:SampleData ItemCount=5}" SelectionMode="Multiple"
                 ItemTemplate="{StaticResource myDT}"
                 Height="300" Width="600"/>
    </Grid>
相关推荐
故渊at2 小时前
第二板块:Android 四大组件标准化学理 | 第十二篇:四大组件全景总结与系统服务(System Server)架构
android·架构·wpf·四大组件·system service
伶俜665 小时前
# [特殊字符] 零基础学 ArkUI 数据持久化(专题三):5 种存储方案深度对比
学习·华为·wpf·harmonyos
IT策士6 小时前
Redis 从入门到精通:数据结构String 与键管理
数据结构·redis·wpf
AC赳赳老秦6 小时前
技术文章素材收集自动化:用 OpenClaw 自动爬取行业资讯、技术热点、优质文章
运维·开发语言·python·自动化·wpf·deepseek·openclaw
加号37 小时前
【WPF】 Storyboard 故事板动画设计深度解析
wpf
xiaoshuaishuai87 小时前
C# Avalonia 依赖属性与WPF的区别
开发语言·c#·wpf
大G的笔记本16 小时前
生产级 Spring Boot 网关简单实现方案
wpf
稷下元歌2 天前
七天学会plc加机器视觉之AI 接入 外设模块开发全详细操作文档(全程配套视频按文档实操)
python·sql·qt·贪心算法·r语言·wpf·时序数据库
happyprince3 天前
11-Hugging Face Transformers 分布式与并行系统深度分析
分布式·c#·wpf
加号33 天前
【WPF】 基于 Canvas 读取并渲染 DXF 文件的技术指南
c#·wpf