WPF学习笔记(13)列表框控件ListBox与数据模板
列表框控件ListBox与数据模板
- 一、ListBox
- 1. ListBox概述
- 2. ItemsControl类
- 3. Selector类
- 4. 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,列表显示字符串:
<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>