列表视图控件ListView与数据模板
一、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的属性设置相应内容的数据模板