首页 > 代码库 > WPF里ItemsControl的分组实现
WPF里ItemsControl的分组实现
我们在用到ItemsControl时,有时会用到分组,如ListBox,ListView,DataGrid。WPF的ItemsControl可以实现分组,是依托于GroupStyle,以ListBox为例,他的分组效果图为:
以下为前台:
1 <ListBox Name="lbMain"> 2 <ListBox.ItemTemplate> 3 <DataTemplate> 4 <StackPanel Orientation="Horizontal"> 5 <TextBlock Text="{Binding FileName}" 6 Width="150" /> 7 <TextBlock Text="{Binding AuthorName}" 8 Width="100" /> 9 <TextBlock Text="{Binding UpTime}"10 Width="100" />11 </StackPanel>12 </DataTemplate>13 </ListBox.ItemTemplate>14 <ListBox.GroupStyle>15 <GroupStyle>16 <GroupStyle.ContainerStyle>17 <Style TargetType="{x:Type GroupItem}">18 <Setter Property="Template">19 <Setter.Value>20 <ControlTemplate TargetType="{x:Type GroupItem}">21 <Expander IsExpanded="True"22 ExpandDirection="Down">23 <Expander.Header>24 <StackPanel Orientation="Horizontal">25 <TextBlock Text="{Binding Path=Name}"26 VerticalAlignment="Center" />27 <TextBlock Text="{Binding Path=ItemCount, StringFormat=数量:{0}}"28 VerticalAlignment="Center"29 Margin="5,0,0,0" /> 30 <Button Content="Sale"31 Margin="5,0,0,0" />32 </StackPanel>33 </Expander.Header>34 <ItemsPresenter />35 </Expander>36 </ControlTemplate>37 </Setter.Value>38 </Setter>39 </Style>40 </GroupStyle.ContainerStyle>41 </GroupStyle>42 </ListBox.GroupStyle>43 </ListBox>
从16行可以看出,GroupStyle定义的是控件内部样式,所以有人尝试在这里绑实体数据属性的话肯定是失败的,注意25行只能是Name,不管分组的属性叫什么名,这都只能是Name,我写了个Button在里面,如果想知道为什么只能是Name,写个Click处理,把Button的DataContext打印出来就什么都知道了。如果想在这里做更多的处理,比如进行一些负责的运算,可以写加转换器。
这里只是弄了一个原始的Expander装载分组控件,需要美化可以另写样式。
以下是后台:
1 public class ModelFile 2 { 3 public string FileName { get; set; } 4 public string AuthorName { get; set; } 5 public string UpTime { get; set; } 6 } 7 8 public partial class MainWindow : Window 9 {10 public ObservableCollection<ModelFile> CollectionModelFile = new ObservableCollection<ModelFile>();11 12 public MainWindow()13 {14 InitializeComponent();15 16 CollectionModelFile.Add(new ModelFile() { FileName = "WPF进化史", AuthorName = "王鹏", UpTime = "2014-10-10" });17 CollectionModelFile.Add(new ModelFile() { FileName = "WPF概论", AuthorName = "大飞", UpTime = "2014-10-10" });18 CollectionModelFile.Add(new ModelFile() { FileName = "WPF之美", AuthorName = "小虫", UpTime = "2014-10-11" });19 CollectionModelFile.Add(new ModelFile() { FileName = "WPF之道", AuthorName = "青草", UpTime = "2014-11-11" });20 CollectionModelFile.Add(new ModelFile() { FileName = "WPF之禅", AuthorName = "得瑟鬼", UpTime = "2014-11-11" });21 CollectionModelFile.Add(new ModelFile() { FileName = "WPF入门", AuthorName = "今晚吃什么", UpTime = "2014-11-11" });22 CollectionModelFile.Add(new ModelFile() { FileName = "WPF神技", AuthorName = "无间道王二", UpTime = "2014-12-12" });23 CollectionModelFile.Add(new ModelFile() { FileName = "WPF不为人知之密", AuthorName = "星期八", UpTime = "2014-12-12" });24 CollectionModelFile.Add(new ModelFile() { FileName = "WPF之革命", AuthorName = "两把刀", UpTime = "2014-12-12" });25 26 lbMain.ItemsSource = CollectionModelFile;27 28 ICollectionView cv = CollectionViewSource.GetDefaultView(lbMain.ItemsSource);29 cv.GroupDescriptions.Add(new PropertyGroupDescription("UpTime"));30 }31 }
重点是28、29行,有了这两句,ListBox就能准确得分组显示了,其他ItemsControl的分组类同。
至此一个简单的ListBox分组显示就完成了,Demo已放群里,需要的可以下载来看。
WPF里ItemsControl的分组实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。