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 PropertyGroupDescription(UpTime));
}
31 }
重点是28、29行,有了这两句,ListBox就能准确得分组显示了,其他ItemsControl的分组类同。
至此一个简单的ListBox分组显示就完成了,Demo已放群里,需要的可以下载来看。
标签: WPF