c# - 如何禁用此 WPF ComboBox 上的选择事件而不禁用它?
问题描述
我有以下组合框 XAML:
<ComboBox Width="350" ItemsSource="{Binding RunSets}" SelectedItem="{Binding SelectedRunSet, Mode=OneWay}" VerticalAlignment="Center" Height="20" Margin="5,1,0,0" Background="DimGray" Foreground="White" >
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
<ComboBox.ItemTemplate>
<DataTemplate>
<Grid Width="320">
<CheckBox IsChecked="{Binding IsSelected}" Margin="2,2,10,0" Visibility="{Binding ExchangeMarketNamesVisibility}" PreviewMouseDown="RunsetComboBoxItem_PreviewMouseDown">
<CheckBox.Content>
<StackPanel PreviewMouseDown="RunsetComboBoxItem_PreviewMouseDown">
<StackPanel Orientation="Horizontal" PreviewMouseDown="RunsetComboBoxItem_PreviewMouseDown">
<TextBlock Text="{Binding DisplayName}" PreviewMouseDown="RunsetComboBoxItem_PreviewMouseDown"/>
</StackPanel>
<StackPanel PreviewMouseDown="RunsetComboBoxItem_PreviewMouseDown">
<TextBlock Text="{Binding ExchangeMarketNames, StringFormat= {0}}" Visibility="{Binding ExchangeMarketNamesVisibility}" Margin="2,2,0,2" Foreground="LightGray" PreviewMouseDown="RunsetComboBoxItem_PreviewMouseDown" />
</StackPanel>
</StackPanel>
</CheckBox.Content>
</CheckBox>
<TextBlock Text="Select Items..." Visibility="{Binding DefaultItemVisibility}"/>
</Grid>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
我试图实现的目标是让 ComboBox 呈现一组可选择的 ComboBoxItems。关闭时应始终显示“选择项目”:
打开后,我希望它显示以下内容:
单击突出显示的区域时,它应该选中复选框而不关闭组合框。通过破解 Visibility 属性以隐藏“选择项目...”ComboBoxItem 中的复选框,我设法获得了我想要的大部分行为。连同捕获 PreviewMouseDown 事件:
private void RunsetComboBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
var checkBox = sender as CheckBox;
if(checkBox != null)
{
checkBox.IsChecked = !checkBox.IsChecked;
e.Handled = true;
}
}
这几乎可以完美运行,但有两个问题我无法解决:
如果我单击下拉列表中 ComboBoxItems 之间的边框,它将选择该 ComboBoxItem。我希望它永远不会选择其中任何一个。通过在 Grid 中捕获预览鼠标按下事件并将其标记为已处理,我设法解决了突出显示区域内的点击问题。不幸的是,在边框中这不会被触发,并且 SelectedItemChanged 事件会在 ComboBox 上触发。这会导致所选项目发生变化(如前所述,我希望 ComboBox 始终显示“Select Items ...”ComboBoxItem。
展开组合框时,“选择项目...”会显示两次。我希望它只显示一次。
通过破解 Visibility 属性以隐藏“选择项目...”ComboBoxItem 中的复选框以及捕获 PreviewMouseDown 事件,我设法获得了我想要的大部分行为。
我已经阅读了许多关于此的堆栈溢出帖子,但我还没有找到这样做的方法。我尝试捕获 SelectionChange 并将其标记为已处理,但它仍然关闭了组合框,并且没有 PreviewSelectionChange 事件。选择一个项目后,我希望组合框保持打开状态。
有什么办法可以做到这一点?如果我可以添加更多信息来澄清我的问题,请告诉我。谢谢!
解决方案
推荐阅读
- database - 使用 typeORM 批量插入/更新的有效方法
- authentication - 两个 Yii2 应用登录冲突
- android - Flutter SDK 目录相关问题
- javascript - 每当在底部添加新 div 时都需要滚动到底部
- python-3.x - 有人可以帮我解决我的python代码中的错误吗?
- docker - 为什么我在 docker 中使用 Go 得到 404
- docker - 豆荚没有被创建,也没有在很长一段时间后运行
- sqlite - 被解雇的 Dismissible 小部件仍然是颤动树的一部分
- c++ - 如何将色彩空间信息添加到在 OPenCV 中使用“imwrite”创建的 Radiance HDR 格式文件
- tensorflow.js - 启用在本地计算机中使用 Tensorflow JS