首页 > 解决方案 > 如何禁用此 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;
                
            }
        }

这几乎可以完美运行,但有两个问题我无法解决:

  1. 如果我单击下拉列表中 ComboBoxItems 之间的边框,它将选择该 ComboBoxItem。我希望它永远不会选择其中任何一个。通过在 Grid 中捕获预览鼠标按下事件并将其标记为已处理,我设法解决了突出显示区域内的点击问题。不幸的是,在边框中这不会被触发,并且 SelectedItemChanged 事件会在 ComboBox 上触发。这会导致所选项目发生变化(如前所述,我希望 ComboBox 始终显示“Select Items ...”ComboBoxItem。

  2. 展开组合框时,“选择项目...”会显示两次。我希望它只显示一次。

通过破解 Visibility 属性以隐藏“选择项目...”ComboBoxItem 中的复选框以及捕获 PreviewMouseDown 事件,我设法获得了我想要的大部分行为。

我已经阅读了许多关于此的堆栈溢出帖子,但我还没有找到这样做的方法。我尝试捕获 SelectionChange 并将其标记为已处理,但它仍然关闭了组合框,并且没有 PreviewSelectionChange 事件。选择一个项目后,我希望组合框保持打开状态。

有什么办法可以做到这一点?如果我可以添加更多信息来澄清我的问题,请告诉我。谢谢!

标签: c#wpfcombobox

解决方案


推荐阅读