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

发布于:2025-07-04 ⋅ 阅读:(10) ⋅ 点赞:(0)


一、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,列表显示字符串:

    <Grid>
        <!--d:仅在设计界面显示-->
        <ListBox x:Name="listBox" d:ItemsSource="{d:SampleData ItemCount=5}" SelectionMode="Multiple">
    </Grid>
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类的对象:

//创建学生类,包含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);
        }
    }
}
    <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属性引用,示例代码如下:

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);
        }
    }
}
    <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>

在这里插入图片描述


网站公告

今日签到

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