萝卜家园WPF如何实现带全选复选框的列表控件

这个控件是由一个复选框(CheckBox)与一个 ListView 组合而成。它的操作逻辑:
当选中“全选”时,列表中所有的项目都会被选中;反之,取消选中“全选”时,所有项都会被取消勾选。
在列表中选中部分数据项目时,“全选”框会呈现不确定状态(Indetermine)。
由此看出,“全选”复选框与列表项中的复选框达到了双向控制的效果。
其设计思路:首先,创建自定义控件(CheckListView),在其 ControlTemplate 中定义 CheckBox 和 ListView,并为 ListView 设置 ItemTemplate,在其中增加 CheckBox 控件,如下:
<ControlTemplate TargetType="{x:Type control:CheckListView}"> <Grid Background="{TemplateBinding Background}"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <CheckBox Content="全选" /> <ListView x:Name="list" Grid.Row="1"> <ListView.ItemTemplate> <DataTemplate> <CheckBox /> </DataTemplate> </ListView.ItemTemplate> </ListView> </Grid> </ControlTemplate>
其次,为控件添加两个依赖属性,其中一个为 ItemsSource,即该控件所要接收的数据源,也即选择列表;本质上,这个数据源会指定给其内的 ListView。另外也需要一个属性 IsSelectAllChecked 表示是否选中全选复选框。
public static readonly DependencyProperty IsSelectAllCheckedProperty = DependencyProperty.Register("IsSelectAllChecked", typeof(bool?), typeof(CheckListView), new PropertyMetadata(false)); public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(object), typeof(CheckListView), new PropertyMetadata(null)); /// <summary> /// 返回或设置全选复选框的选中状态 /// </summary> public bool? IsSelectAllChecked { get { return (bool?)GetValue(IsSelectAllCheckedProperty); } set { SetValue(IsSelectAllCheckedProperty, value); } } /// <summary> /// 数据源 /// </summary> public object ItemsSource { get { return (object)GetValue(ItemsSourceProperty); } set { SetValue(ItemsSourceProperty, value); } }
需要注意的一点是,作为一个自定义控件,我们必须考虑它的通用性,所以为了保证能设置各式各样的数据源(如用户列表、物品列表或 XX名称列表),在这里定义一个数据接口,只要数据源中的数据项实现该接口,即可达到通用的效果。该接口定义如下:
public interface ICheckItem { /// <summary> /// 当前项是否选中 /// </summary> bool IsSelected { get; set; } /// <summary> /// 名称 /// </summary> string Name { get; set; } }
最后,我们把刚才定的属性绑定的控件上,如下:
<CheckBox Content="全选" IsChecked="{Binding IsSelectAllChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=Twoway}" /> <ListView x:Name="list" Grid.Row="1" ItemsSource="{TemplateBinding ItemsSource}"> <ListView.ItemTemplate> <DataTemplate> <CheckBox Content="{Binding Name}" IsChecked="{Binding IsSelected}" /> </DataTemplate> </ListView.ItemTemplate> </ListView>
接下来,实现具体操作:
首先,通过“全选”复选框来控制所有列表项:这里通过其 Click 事件来执行 CheckAllItems 方法, 在此方法中,会对数据源进行遍历,将其 IsSelected 属性设置为 True 或 False。代码如下:
<CheckBox Content="全选" IsChecked="{Binding IsSelectAllChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=Twoway}"> <i:Interaction.Triggers> <i:EventTrigger EventName="Click"> <ei:CallMethodAction MethodName="CheckAllItems" TargetObject="{Binding RelativeSource={RelativeSource TemplatedParent}}" /> </i:EventTrigger> </i:Interaction.Triggers> </CheckBox>
/// <summary> /// 全选或清空所用选择 /// </summary> public void CheckAllItems() { foreach (ICheckItem item in ItemsSource as IList<ICheckItem>) { item.IsSelected = IsSelectAllChecked.HasValue ? IsSelectAllChecked.Value : false; } }
然后,通过选中或取消选中列表项时,更新“全选”复选框的状态:在 DataTemplate 中,我们也为 CheckBox 的 Click 事件设置了要触发的方法 UpdateSelectAllState,代码如下:
<DataTemplate> <CheckBox Content="{Binding Name}" IsChecked="{Binding IsSelected}"> <i:Interaction.Triggers> <i:EventTrigger EventName="Click"> <ei:CallMethodAction MethodName="UpdateSelectAllState" TargetObject="{Binding RelativeSource={RelativeSource AncestorType=control:CheckListView}}" /> </i:EventTrigger> </i:Interaction.Triggers> </CheckBox> </DataTemplate>
- 新萝卜家园Win10系统下载
- 新萝卜家园Ghost Win10 (64位) 快速装机版v201804(自动激活)
- 萝卜家园Ghost Win10x86 快速专业版 V2019.10月(无需激活)
- 萝卜家园 Ghost Win10 X64位 企业版 2018.12月 (免激活)
- 新萝卜家园Ghost Win10 (X64) 精选装机版V2018.05月(免激活)
- 新萝卜家园Ghost Win10 (64位) 推荐装机版V201709(永久激活)
- 新萝卜家园Win7系统下载
- 萝卜家园 GHOST WIN7 SP1 X86 装机特别版 V2016.02
- 萝卜家园GHOST WIN7 x64位 好用旗舰版 2019v04(无需激活)
- 萝卜家园Ghost Win7 x86 2019元旦旗舰版(绝对激活)
- 新萝卜家园 Ghost Win7 SP1 64位 极速装机版 2014.12
- 萝卜家园GHOST WIN7 x64 热门旗舰版 v2020年09月(绝对激活)
- 相关推荐
- 小编推荐
- 新萝卜家园系统专栏
萝卜家园Ghost Win10 X64 经典专业版 2019年08月(绝对激活)萝卜家园Ghost Win10 X64 经典专业版 2019年08月(绝对激活)
新萝卜家园Ghost Win10 x32极速体验版2017V01(无需激活)新萝卜家园Ghost Win10 x32极速体验版2017V01(无需激活)
新萝卜家园Win10 经典装机版 2020.08(32位)新萝卜家园Win10 经典装机版 2020.08(32位)
新萝卜家园Ghost Win10 64位安全企业版2016.10(无需激活)新萝卜家园Ghost Win10 64位安全企业版2016.10(无需激活)
新萝卜家园Win10 64位 大神2021新年春节版新萝卜家园Win10 64位 大神2021新年春节版
萝卜家园Ghost Win10 64位 多驱动专业版 v2021年01月(无需激活)萝卜家园Ghost Win10 64位 多驱动专业版 v2021年01月(无需激活)
萝卜家园GHOST WIN7 64位 通用旗舰版 V2019.02月(激活版)萝卜家园GHOST WIN7 64位 通用旗舰版 V2019.02月(激活版)
萝卜家园GHOST WIN7 X64 通用旗舰版 v2020年08月(激活版)萝卜家园GHOST WIN7 X64 通用旗舰版 v2020年08月(激活版)
新萝卜家园W7 办公装机版 v2020.05(64位)新萝卜家园W7 办公装机版 v2020.05(64位)
萝卜家园GHOST WIN7 x64位 极速旗舰版 V2019年12月(免激活)萝卜家园GHOST WIN7 x64位 极速旗舰版 V2019年12月(免激活)
新萝卜家园GHOST WIN7 (32位) 绝对装机版2018v06(免激活)新萝卜家园GHOST WIN7 (32位) 绝对装机版2018v06(免激活)
新萝卜家园 Ghost Win7 X86 极速装机版 v2015.03新萝卜家园 Ghost Win7 X86 极速装机版 v2015.03
- 新萝卜家园系统安装教程
