WPF ComboBox: как узнать, когда контейнер элемента (когда он был открыт) потерял фокус

Я хочу создать поведение, в котором ComboBox выпадающий закрывается при потере фокуса. Моя первая попытка была:

public class ComboBoxLostFocusBehavior : Behavior<ComboBox> {

    protected override void OnAttached() {
        base.OnAttached();

        AssociatedObject.LostFocus += (object sender, RoutedEventArgs e) => AssociatedObject.IsDropDownOpen = false;
    }
}

но событие LostFocus относится только к части переключателя, а не к контейнеру предметов.

Как я могу обратиться к выпадающему списку?

Я хочу: когда выпадающий список потерял фокус -> раскрывающийся список закрывается

РЕДАКТИРОВАТЬ:

Я думаю, что вопрос неправильно понят. ComboBox состоит из 2 основных частей: части, которую вы видите, когда она закрыта (давайте назовем ее A), и раскрывающегося списка (давайте назовем ее B). LostFocus относится только к части A. Таким образом, в сценарии, который я представил в вопросе, который является неправильным, вы открываете выпадающий список, перемещаете мышь от A к B, и когда вы просто выходите из A и получаете B, B закрывается (по поведение). Итак, в заключение, LostFocus - неправильный путь, и я ищу что-то еще, чтобы подразумевать, что выпадающий список (B) потерял фокус.

1 ответ

Если я правильно понимаю вас из вопроса / комментариев, вы хотите знать, теряет ли фокус выпадающий список после открытия раскрывающегося списка.

Вы можете использовать IsDropDownOpen свойство в событии LostFocus, например

    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.LostFocus += (s, e) =>
            {
                if (AssociatedObject.IsDropDownOpen)
                {
                    //dropdown is open and control is loosing focus, you may perhaps want to close it
                    AssociatedObject.IsDropDownOpen = false;
                }
            };
    }

или вы можете прикрепить DropDownOpened & DropDownClosed события и поддерживать свое собственное состояние, например

    bool isDropDownOpen;
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.DropDownOpened += (s, e) => isDropDownOpen = true;
        AssociatedObject.DropDownClosed += (s, e) => isDropDownOpen = false;

        AssociatedObject.LostFocus += (s, e) =>
            {
                if (isDropDownOpen)
                {
                    //dropdown is open and control is loosing focus, you may perhaps want to close it
                    AssociatedObject.IsDropDownOpen = false;
                }
            };
    }

или, возможно, использовать эти события каким-либо другим способом, например,

    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.DropDownClosed += (s, e) =>
            {
                //your action on dropdown close
            };
    }
Другие вопросы по тегам