zoukankan      html  css  js  c++  java
  • 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已放群里,需要的可以下载来看。

  • 相关阅读:
    The Python Standard Library
    Python 中的round函数
    Python文件类型
    Python中import的用法
    Python Symbols 各种符号
    python 一行写多个语句
    免费SSL证书(https网站)申请,便宜SSL https证书申请
    元宇宙游戏Axie龙头axs分析
    OLE DB provider "SQLNCLI10" for linked server "x.x.x.x" returned message "No transaction is active.".
    The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "xxx.xxx.xxx.xxx" was unable to begin a distributed transaction.
  • 原文地址:https://www.cnblogs.com/zoexia/p/4134012.html
Copyright © 2011-2022 走看看