如何在WPF ComboBox中添加不可点击的分组标题?
在WPF ComboBox中添加不可点击的分组标题
要实现你要的效果,咱们可以通过数据分组+自定义分组样式来搞定,具体步骤如下:
1. 准备带分组结构的数据源
首先,你需要把原来的零散数值整理成带分组信息的结构,比如创建一个简单的模型类:
public class GameZoneItem { // 分组名称(对应Liste 1、Liste 2) public string GroupName { get; set; } // 原来的区域数值 public short ZoneNumber { get; set; } }
然后在你的ViewModel或者后台代码里初始化数据:
// 构造分组数据 var zoneItems = new List<GameZoneItem> { new GameZoneItem { GroupName = "Liste 1", ZoneNumber = 501 }, new GameZoneItem { GroupName = "Liste 1", ZoneNumber = 301 }, new GameZoneItem { GroupName = "Liste 2", ZoneNumber = 11 }, // 可以继续添加更多分组和数值 }; // 创建CollectionViewSource来实现分组 var viewSource = new CollectionViewSource { Source = zoneItems }; viewSource.GroupDescriptions.Add(new PropertyGroupDescription(nameof(GameZoneItem.GroupName))); // 绑定到ComboBox的ItemsSource ComboBoxTypeJeu.ItemsSource = viewSource.View;
2. 修改XAML中的ComboBox配置
把原来硬编码的<sys:Int16>项删掉,替换成分组样式配置,同时保留你原来的绑定、事件和样式属性:
<ComboBox x:Name="ComboBoxTypeJeu" HorizontalAlignment="Left" Margin="297,151,0,0" VerticalAlignment="Top" Width="146" FontSize="20" FontFamily="Klavika Bd" <!-- 用SelectedValue绑定原来的Int16类型属性,指定取值路径 --> SelectedValue="{Binding NumberOfZones, Mode=TwoWay}" SelectedValuePath="ZoneNumber" SelectionChanged="ComboBoxTypeJeu_SelectionChanged"> <!-- 自定义分组标题样式,设置不可点击 --> <ComboBox.GroupStyle> <GroupStyle> <GroupStyle.HeaderTemplate> <DataTemplate> <TextBlock Text="{Binding Name}" FontWeight="Bold" Foreground="#FF666666" <!-- 核心设置:让分组头不响应鼠标和键盘交互 --> IsHitTestVisible="False" Focusable="False"/> </DataTemplate> </GroupStyle.HeaderTemplate> </GroupStyle> </ComboBox.GroupStyle> </ComboBox>
关键说明
IsHitTestVisible="False"会让分组标题完全不响应鼠标点击,Focusable="False"避免键盘焦点移动到分组头上,确保它完全不可交互。- 因为你原来的
NumberOfZones是Int16类型,所以用SelectedValue+SelectedValuePath来绑定,这样就能和原来的ViewModel属性完美匹配,不需要修改原有绑定逻辑。 - 如果偏好纯XAML方式,也可以把
CollectionViewSource定义为窗口资源,再绑定到ComboBox,效果是一样的。
内容的提问来源于stack exchange,提问作者Zak Koli
相关产品推荐
相关产品推荐

