分组
RadListView为您提供在运行时以编程方式对其数据进行分组的功能。属性的组描述符可以实现这一点RadListView。GroupDescriptors收集。
此外,该控件支持通过UI通过点击组标题或以编程方式展开和折叠组操作。有关这方面的更多详细信息,请参阅展开和折叠组.
PropertyGroupDescriptor
可以根据定义项的类的属性值对数据进行分组。这个描述符公开了以下属性:
- PropertyName:定义要分组的属性的字符串名称。
- 排序方式:定义每个组的排序顺序为升序或降序。
例如,让我们有以下业务对象:
公共类城市{公共字符串名称{获取;设置;}公共字符串国家{获取;设置;}}
和一个包含Cities集合的ViewModel:
公共类ViewModel {public ObservableCollection Cities {get;设置;} public ViewModel() {this。城市城市= new ObservableCollection < >(){新城市(){Name =“巴塞罗那”,国家=“西班牙”},新城市(){Name =“马德里”,国家=“西班牙”},新城市(){Name =“罗马”,国家=“意大利”},新城市(){Name =“佛罗伦萨”,国家=“意大利”},新城市(){Name =“伦敦”,国家=“英格兰”},新城市(){Name =“曼彻斯特”,国家=“英格兰”},新城市(){Name =“纽约”,国家=“美国”},新城市(){Name =“波士顿”,国家= "美国"}};}}
下面的代码段演示了如何通过PropertyGroupDescriptor通过“国家”属性对城市进行分组:
< / telerikDataControls: RadListView >
GroupHeaderTemplate
此外,您还可以创建自定义GroupHeaderTemplate还有ListViewItemTemplate以便在分组ListView时实现所需的外观。GroupHeader的BindingContext是一个复杂的对象,它包括以下属性:
- 扩大:定义一个值,该值指示该组当前是否展开(使其子项可见)。
- 项目:获取组的子项。
- 关键:获取组键的特定值。
- 水平:获取组的从零开始的级别(或深度)。
下面的代码段显示了如何GroupHeaderTemplate定义:
<网格> <网格。ColumnDefinition >
剩下的就是将ViewModel设置为控件的BindingContext:
列表视图。BindingContext = new ViewModel();
图1:通过PropertyGroupDescriptor分组的ListView
DelegateGroupDescriptor
这个描述符允许你根据一个自定义的键进行分组(例如组合了两个或多个属性的复杂表达式),而不是受限于单个属性的值。这个描述符公开了以下属性:
- KeyExtractor:定义
(Func <对象,对象)
委托,该委托返回用于检索每个数据项的组键的属性。 - 排序方式:定义每个组的排序顺序为升序或降序。
让我们使用上一节中的相同示例,只是通过代码添加了DelegateGroupDescriptor。
下面的代码片段显示了ListView实例是如何定义的:
.
你可以创建并应用一个委托来对这些项进行分组(例如按它们的首字母分组),如下所示:
public DelegateGroupDescriptorGroups() {InitializeComponent();列表视图。BindingContext = new ViewModel();var delegateDescriptor = new DelegateGroupDescriptor {KeyExtractor = FirstLetterKeyExtractor};listView.GroupDescriptors.Add (delegateDescriptor);} private object FirstLetterKeyExtractor(object arg) {var item = arg as City;返回项目? . name。Substring (0,1);}
图2:通过DelegateGroupDescriptor分组的ListView
Sticky组头信息
从R1 2020 SP版本开始,RadListView提供了将其组头设置为粘性的选项。这意味着GroupHeader将在滚动项目时“冻结”,直到整个组都被滚动走。当您滚动下一个组时,当前粘贴的组标题将由下一个组标题推送。
要启用粘性组标题行为,只需设置IsGroupHeaderSticky属性的ListView到真正的.缺省情况下,IsGroupHeaderSticky值为False。
. var listView = new RadListView();列表视图。IsGroupHeaderSticky = true;
检查下面的粘性组标题的作用:
绑定GroupDescriptor
GroupDescriptor集合现在可以由用户使用MVVM控制。
为了通过MVVM控制GroupDescriptor集合:
创建一个ObservableCollection类型的属性
在ViewModel中包含所需的组描述符: public ObservableCollection
GroupDescriptors {get{返回this.groupDescriptors;} set {if (this。groupDescriptors != value){此。groupDescriptors = value;OnPropertyChanged ();}}} - 使用OneWayToSource绑定模式,将该属性绑定到RadListView的GroupDescriptors属性:
. Row="2" GroupDescriptors="{绑定GroupDescriptors, Mode=OneWayToSource}" ItemsSource="{绑定项}"> .
下面是通过MVVM的GroupDescriptor集合的样子:
你可以找到一个工作演示标签可绑定的组描述符的ListView/Bindable Collections文件夹中浏览器应用程序.