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