# ListView 使用文档 本文档介绍 AtomUI ListView 控件的各种使用方式,示例代码摘自 Gallery 演示程序。 > 📖 Gallery 源码位置:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/ListShowCase.axaml` --- ## 前置准备 在 AXAML 中使用 ListView,需要引入以下命名空间: ```xml xmlns:atom="https://atomui.net" ``` 在 C# 代码中引入: ```csharp using AtomUI.Desktop.Controls; // ListView, ListViewItem, Pagination using AtomUI.Controls; // SizeType 等共享类型 using AtomUI.Controls.Data; // IListItemData, ListItemData, ListSortDescription ``` --- ## 1. 基础用法 ListView 通过 `ItemsSource` 绑定数据源,数据项需要实现 `IListItemData` 接口: ```xml ``` ```csharp // ViewModel 或 Code-behind 中准备数据 var listItems = new List { new ListItemData { Content = "Blue" }, new ListItemData { Content = "Green" }, new ListItemData { Content = "Red" }, new ListItemData { Content = "Yellow" } }; ``` 默认情况下,ListView 使用内置的 `ItemTemplate` 渲染 `IListItemData.Content` 属性为文本: ```xml ``` > 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/ListShowCase.axaml` 中 "Basic usage" 示例。 --- ## 2. 选择模式 通过 `SelectionMode` 属性设置选择模式,结合 `IsShowSelectedIndicator` 展示选中状态: ```xml ``` ### 单选模式(默认) ```xml ``` ### 多选模式 ```xml ``` ### Toggle 模式 ```xml ``` ### 动态切换选择模式 ```xml Selection Mode: Single Multiple Toggle ``` ```csharp // Code-behind 处理选择模式切换 SelectionModeOptionGroup.OptionCheckedChanged += (sender, e) => { if (DataContext is ListViewModel viewModel && e.CheckedOption.IsChecked == true && e.CheckedOption.Tag is SelectionMode selectionMode) { viewModel.SelectionMode = selectionMode; } }; ``` > 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/ListShowCase.axaml` 中 "Selection" 示例。 --- ## 3. 分组 通过 `IsGroupEnabled="True"` 开启分组功能。数据项需要实现 `IGroupHeader` 接口或通过 `Group` 属性指定分组: ```xml ``` ```csharp // 数据准备 — 使用 Group 属性指定分组 var groupListItems = new List { new ListItemData { Content = "Red", Group = "Basic Colors" }, new ListItemData { Content = "Orange", Group = "Basic Colors" }, new ListItemData { Content = "Green", Group = "Basic Colors" }, new ListItemData { Content = "Blue", Group = "Basic Colors" }, new ListItemData { Content = "Brown", Group = "Neutral Colors" }, new ListItemData { Content = "White", Group = "Neutral Colors" }, new ListItemData { Content = "Black", Group = "Neutral Colors" }, new ListItemData { Content = "Turquoise", Group = "Specific Shades" }, new ListItemData { Content = "Violet", Group = "Specific Shades" }, new ListItemData { Content = "Magenta", Group = "Specific Shades" }, }; ``` > 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/ListShowCase.axaml` 中 "Group" 示例。 --- ## 4. 禁用项 通过设置 `IListItemData.IsEnabled = false` 禁用特定列表项: ```xml ``` ```csharp var listItems = new List { new ListItemData { Content = "Blue" }, new ListItemData { Content = "Green" }, new ListItemData { Content = "Red" }, new ListItemData { Content = "Yellow", IsEnabled = false } // 此项被禁用 }; ``` > 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/ListShowCase.axaml` 中 "Item disabled" 示例。 --- ## 5. 空状态 当数据源为空时,ListView 自动显示空状态指示器。通过按钮动态增删项目来演示空/非空切换: ```xml ``` ```csharp private void HandleAddEmptyItemClicked(object? sender, RoutedEventArgs e) { if (DataContext is not ListViewModel viewModel) return; var items = viewModel.EmptyDemoItems != null ? new List(viewModel.EmptyDemoItems) : new List(); items.Add(new ListItemData { Content = "Dynamic item" }); viewModel.EmptyDemoItems = items; } private void HandleRemoveEmptyItemClicked(object? sender, RoutedEventArgs e) { if (DataContext is not ListViewModel viewModel) return; if (viewModel.EmptyDemoItems is null || viewModel.EmptyDemoItems.Count <= 1) { viewModel.EmptyDemoItems = []; return; } var items = new List(viewModel.EmptyDemoItems); items.RemoveAt(items.Count - 1); viewModel.EmptyDemoItems = items; } ``` > 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/ListShowCase.axaml` 中 "Empty" 示例。 --- ## 6. 过滤 通过 `Filter` 和 `FilterValue` 属性对数据进行过滤。可使用内置的 `ValueFilterProvider` 标记扩展: ```xml ``` 上述配置会过滤出内容包含字母 "a" 的所有项目。 ### 自定义过滤值提取 如果需要按数据项的特定属性过滤,可设置 `FilterValueSelector`: ```csharp // 按自定义属性过滤 listView.FilterValueSelector = record => { if (record is MyDataItem item) return item.Category; return null; }; ``` > 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/ListShowCase.axaml` 中 "Filter" 示例。 --- ## 7. 排序 通过 `SortDescriptions` 属性对数据进行排序: ```xml ``` ```csharp // Code-behind 设置排序 OrderedList.SortDescriptions = [ListSortDescription.FromPath("Content")]; ``` `ListSortDescription.FromPath` 根据属性路径创建排序描述,默认为升序。 > 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/ListShowCase.axaml` 中 "Ordered" 示例。 --- ## 8. 分页 ListView 支持内置分页功能,通过 `BottomPagination`(或 `TopPagination`)放置分页器,配合 `PageSize` 设置每页数量: ```xml ``` ```csharp // 准备大量数据用于分页 var list = new List(); for (var i = 0; i < 2000; i++) { list.Add(new ListItemData { ItemKey = $"{i}", Content = $"Content {i}" }); } viewModel.PaginationListItems = list; ``` ### 分页器位置控制 ```xml ``` ### 分页器对齐 ```xml ``` > 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/ListShowCase.axaml` 中 "Pagination list" 示例。 --- ## 9. 选择绑定 ### 绑定 SelectedItem ```xml ``` ### 绑定 SelectedIndex ```xml ``` ### 多选绑定 SelectedItems ```xml ``` ### 使用 SelectedValue + SelectedValueBinding ```xml ``` ### 监听选择变化事件 ```xml ``` ```csharp private void HandleSelectionChanged(object? sender, SelectionChangedEventArgs e) { foreach (var added in e.AddedItems) { // 处理新选中的项 } foreach (var removed in e.RemovedItems) { // 处理取消选中的项 } } ``` --- ## 10. 加载状态 通过 `IsOperating` 属性展示加载状态覆盖层: ```xml ``` ```csharp // 模拟异步加载 public async Task LoadDataAsync() { IsLoading = true; try { var data = await _service.GetDataAsync(); Items = data; } finally { IsLoading = false; } } ``` --- ## 11. 监听项目点击 ```xml ``` ```csharp private void HandleItemClicked(object? sender, ListViewItemClickedEventArgs e) { var clickedItem = e.Item; // 处理点击逻辑 } ``` --- ## 常见组合模式 ### 基础数据列表 ```xml ``` ### 可搜索的过滤列表 ```xml ``` ```csharp private void HandleSearchTextChanged(object? sender, TextChangedEventArgs e) { if (sender is SearchEdit searchEdit) { FilterableList.FilterValue = searchEdit.Text?.Trim(); } } ``` ### 分组 + 排序列表 ```xml ``` ```csharp // 同时设置排序 listView.SortDescriptions = [ListSortDescription.FromPath("Content")]; ``` ### 大数据分页列表 ```xml ```