这几天做项目,需要做个listview满足能够动态显示或隐藏某些列,由于自己是菜鸟水平,查了两天资料也没有想出解决办法。就在我山穷水尽的时候看到了Mgen的一篇博客,给了我很大启发,所以我也决定把自己做的一些东西给大家说说,希望能帮助像我一样的菜鸟!
我读了Mgen的博文(http://www.cnblogs.com/mgen/archive/2011/07/24/2115458.html),给我很大启发,但也发现有些缺陷。我感觉的缺陷列举如下:
1、控制隐藏显示的逻辑关系有问题,搞不好会抛异常。
2、你设置管理控制显隐的控件只能是继承于itemcontrol的控件,有一定的局限性(比如说我想做一组button按钮,每个button控制一列话,它就不能用了)
下面,我贴出自己的代码,然后分析我是怎样解决这些问题的。
1 <Window x:Class="mgen_autocolumns.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:loc="clr-namespace:mgen_autocolumns" 5 Title="Mgen" Height="350" Width="525"> 6 <DockPanel> 7 <!-- 已经有的ListView --> 8 <ListView Name="list" DockPanel.Dock="Top" > 9 <ListView.View> 10 <GridView loc:GridViewUtility.ColumnObjectCollection="{Binding Path=ColumnCollection}"> 11 <GridViewColumn Header="姓名" 12 Width="100" 13 DisplayMemberBinding="{Binding Name}" /> 14 <GridViewColumn Header="年龄" 15 Width="50" 16 DisplayMemberBinding="{Binding Age}" /> 17 <GridViewColumn Header="分数" 18 Width="100"> 19 <GridViewColumn.CellTemplate> 20 <DataTemplate> 21 <ProgressBar Width="80" Height="10" Maximum="100" Value="{Binding Score}" /> 22 </DataTemplate> 23 </GridViewColumn.CellTemplate> 24 </GridViewColumn> 25 </GridView> 26 </ListView.View> 27 </ListView> 28 29 <!-- 列管理代码 --> 30 <!-- loc命名空间是ColumnObject的CLR命名空间 --> 31 <ListBox ItemsSource="{Binding Path=ColumnCollection.GViewAllCollection}"> 32 <!--<ListBox.ItemContainerStyle> 33 <Style TargetType="ListBoxItem"> 34 <Setter Property="Focusable" Value="False" /> 35 </Style> 36 </ListBox.ItemContainerStyle>--> 37 <ListBox.ItemTemplate> 38 <DataTemplate> 39 <CheckBox IsChecked="{Binding Path=IsVisable}" 40 Content="{Binding Path=Header}" 41 Margin="2"/> 42 </DataTemplate> 43 </ListBox.ItemTemplate> 44 </ListBox> 45 </DockPanel> 46 </Window>