WPF ListBox в MenuItem. Как сохранить меню от закрытия при нажатии в ListBox?

Я пытаюсь создать Excel-подобную сортировку / фильтрацию в DataGrid. Я создал это ContextMenu с ListBox внутри Заголовка MenuItem.

ContextMenu

Когда я нажимаю на флажок или текст флажка, он ведет себя как ожидалось. Однако если я щелкну в пустом поле флажка / списка или в области заголовка за пределами списка, ContextMenu закроется.

Его пока нет на скриншоте, но я буду добавлять кнопки ОК и Отмена под списком. Нажав один из них, я хочу закрыть ContextMenu.

Если вам нужен XAML, вот он:

    <MenuItem x:Name="miListBox"
              Focusable="False">
        <MenuItem.Header>
                <ListBox MaxHeight="150" Focusable="False">

                </ListBox>
        </MenuItem.Header>
    </MenuItem>

1 ответ

Решение

ContextMenu имеет свойство под названием StaysOpen, Просто установите его true чтобы не дать ему автоматически закрыться, а затем вам нужно использовать IsOpen свойство открывать / закрывать вручную:

<ContextMenu StaysOpen="true">
    <ContextMenu.Resources>

    <!-- ... --->
</ContextMenu>

Редактировать:

Из MSDN, StaysOpen свойство должно было работать, как следует из названия, однако выглядит так, будто оно просто бесполезно. Потому что это не работает ожидаемо. Каким-то образом IsOpen всегда устанавливается в значение false автоматически при нажатии на один из элементов MenuIms или когда мы щелкаем за пределами ContextMenu. И как в документации о StaysOpen, ContextMenu все еще закрыт, когда IsOpen установлено в false. Проблема здесь в том, что мы не устанавливаем это вручную, но оно автоматически устанавливается каким-то образом и, следовательно, бесполезностью StaysOpen,

Мы можем установить StaysOpenOnClick вместо каждого элемента MenuItem:

<ContextMenu>
    <ContextMenu.Resources>
         <Style TargetType="MenuItem">
              <Setter Property="StaysOpenOnClick" Value="True"/>
         </Style>
    </ContextMenu.Resources>
    <!-- ... -->
</ContextMenu>
Другие вопросы по тегам