WinUI 3+C#:如何让ListView项不可选但CheckBox可勾选?
解决WinUI 3 ListView仅允许CheckBox交互、禁止行选中的问题
核心思路
不要直接禁用整个ListView的命中测试,而是针对ListViewItem的选中行为进行控制,同时保留内部CheckBox的交互能力。
方案一:通过ItemContainerStyle禁止列表项选中(推荐)
修改ListView的ItemContainerStyle,直接禁用列表项的选中功能,并移除点击视觉反馈:
<ListView x:Name="filterListView"> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <!-- 彻底禁止列表项被选中 --> <Setter Property="IsSelectable" Value="False"/> <!-- 移除行点击/悬停时的视觉效果,明确告知用户行不可交互 --> <Setter Property="Background" Value="Transparent"/> <Setter Property="PointerOverBackground" Value="Transparent"/> <Setter Property="PressedBackground" Value="Transparent"/> </Style> </ListView.ItemContainerStyle> <ListView.ItemTemplate> <DataTemplate> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="35" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <CheckBox Grid.Column="0" IsChecked="{Binding SubIsSelected, Mode=TwoWay}" /> <TextBlock Grid.Column="1" Text="{Binding SubFilterName}" /> </Grid> </DataTemplate> </ListView.ItemTemplate> </ListView>
说明
IsSelectable="False"是关键,它直接关闭了ListViewItem的选中逻辑,不会影响内部CheckBox的双向绑定和交互。- 设置背景相关属性是为了消除行的点击反馈,避免用户产生误解。
方案二:通过SelectionChanged事件强制取消选中(备选)
如果方案一无法满足需求,可通过监听选中事件,强制清空选中项:
- 在XAML中给ListView添加事件绑定:
<ListView x:Name="filterListView" SelectionChanged="filterListView_SelectionChanged"> <!-- 原有ItemTemplate代码 --> </ListView>
- 在C#后台实现事件处理:
private void filterListView_SelectionChanged(object sender, SelectionChangedEventArgs e) { filterListView.SelectedItems.Clear(); }
为什么之前的方法无效?
设置ListView.IsHitTestVisible="False"会让整个ListView容器拒绝所有交互事件,内部控件即使设置IsHitTestVisible="True"也无法接收到事件——因为事件无法穿透禁用了命中测试的父容器。
内容的提问来源于stack exchange,提问作者Ethan Allen
相关产品推荐
相关产品推荐

