【问题标题】:ComboBox with Checkboxes closes on Checkbox Click带有复选框的组合框在复选框单击时关闭
【发布时间】:2011-12-28 22:05:15
【问题描述】:

我有this 相同的问题,但提出的解决方案不起作用,我也没有找到任何其他解决方案。我想用CheckBoxes 创建一个ComboBox 作为ItemTemplate 的一部分。这已经实现了。但是当用户单击CheckBox 时出现问题:PopUp 关闭。我需要它保持打开状态。

我尝试处理ComboBox.SelectionChanged 事件和CheckBox.Click 事件,但我无法得到它。从跟踪代码来看,当用户单击 CheckBox 时,SelectionChanged 事件似乎根本没有触发,这与控件的行为相匹配,因为在 TextBox 部分中没有出现任何内容。

这不是用于多选,而是让CheckBox 绑定到数据上下文中的属性。

这里是一些示例代码

<Toolbar VerticalAlignment="Top">
    <ComboBox x:Name="comboBox" SelectionChanged="ComboBox_SelectionChanged">
        <ComboBox.ItemTemplate>
            <DataTemplate DataType="local:MyType">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <CheckBox Click="CheckBox_Clicked"/>
                    <TextBlock Text="{Binding Title}" Grid.Column="1"/>
                </Grid>
            </DataTemplate>
        </ComboBox.ItemTemplate>
        <local:MyType Title="item 1"/>
        <local:MyType Title="item 2"/>
        <local:MyType Title="item 3"/>
        <local:MyType Title="item 4"/>
    </ComboBox>
</Toolbar>

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // do some stuff
}

private void CheckBox_Clicked(object sender, RoutedEventArgs e)
{
    // change a property on the data context if not data bound

    // Tried this, but Popup just closes then reopens
    comboBox.IsDropDownOpen = true;
    // This seems to have no effect
    e.Handled = true;
}

谁能帮忙?

编辑:

我注意到将ComboBox 放在Toolbar 中时的行为有所不同。当不在Toolbar 中时,它按预期运行:CheckBox 更改状态而不关闭Popup。但是在ToolBar 中,Popup 在第一次点击时关闭,无论点击在哪里。请尝试新代码。我真的需要这个在工具栏中。

编辑 2:

对于后代和任何搜索它的人,MS suggested 将 DataTemplate 中 CheckBox 的 Focusable 属性设置为 false。这样就达到了预期的效果。

【问题讨论】:

  • 你首先不应该在 ComboBox 中有 CheckBoxes。
  • 我同意@H.B.组合框不应该是多选的。原因是没有标准的方法来关闭组合框,即你必须找到一个不同的地方来点击它来关闭它。拥有某种可扩展元素以包含一个简单的列表框会更好。
  • 我已将您的解决方案复制到空白 wpf 项目,但我无法重现您的问题:当我单击复选框时,弹出窗口仍然打开。只有当我点击组合框外的某个地方时它才会关闭。
  • @mydogisbox:正如我所说,这不适用于多项选择。这是用于编辑源对象的属性。 ComboBox 是用户常用的界面元素。这种类型的控件在 AutoCAD 中用于图层的基本编辑。
  • @vortex,我会在新的解决方案中尝试。也许我的项目中的其他东西导致了这个问题。

标签: wpf combobox checkbox popup


【解决方案1】:

您需要的是 Check ComboBox 控件,它是 WPF 扩展工具包的一部分。你可以在这里找到它:Check ComboBox

【讨论】:

  • 页面说这个控件还在开发中。此外,该控件用于多项选择,而不是编辑基础数据对象的属性。不过,谢谢。
【解决方案2】:

似乎Toolbar 控件以某种方式影响ComboBox 控件。奇怪的是,当您将光标放在TextBox 内时,ComboBox 并没有关闭,而是在 CheckBox 上出现问题。

解决此问题的最快方法是在用户单击CheckBox 时手动更改焦点。 我使用以下步骤顺序:

1) 为应用程序中的每个控件处理GotFocus 事件

2) 只保留CheckBox 控件的事件

3) 检查CheckBox是否在当前ComboBox

4) 如果是,将焦点返回到ComboBox

    public MainWindow()
    {
        InitializeComponent();

        //...

        comboBox.AddHandler(FrameworkElement.GotFocusEvent, (RoutedEventHandler)OnGotFocus);
    }

    private void OnGotFocus(object sender, RoutedEventArgs e)
    {
        if (e.OriginalSource is CheckBox)
        {
            var comboBox = (ComboBox)sender;
            var comboBoxItem = GetParentElement<ComboBoxItem>(e.OriginalSource);

            if (comboBoxItem != null && comboBox.Items.OfType<object>().Select(comboBox.ItemContainerGenerator.ContainerFromItem).Contains(comboBoxItem))
                comboBox.Focus();
        }
    }

    private T GetParentElement<T>(object element) where T : DependencyObject
    {
        var current = element as DependencyObject;

        while (current != null && !(current is T))
        {
            current = VisualTreeHelper.GetParent(current);
        }

        return current as T;
    }

这是一个相当混乱的解决方案,但无论如何它都有效。

【讨论】:

  • 哇。谢谢。那凌乱的。但我想你必须做一些必要的事情才能让它工作。我已经创建了一个新的question,看看是否有人可以确定它为何表现不同。你可能想关注它。
猜你喜欢
  • 2019-02-27
  • 2021-01-01
  • 2013-06-15
  • 2014-12-25
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
相关资源
最近更新 更多