Подтвердить что ты не робот

WPF ComboBox. Выбранное вложенное событие. существуют или нет?

Visual Studio (2015) Редактор XAML предоставляет список автосообщений ComboBox, событие Named Selected. Какое объяснение этого автозаполнения ошибочно? auto complete

Selected его событие не WPF ComboBox (список событий), но его событие ComboBoxItem (унаследовано от ListBoxItem.Selected).

почему?

ИЗМЕНИТЬ

как @glenThomas'answer (спасибо), выбранное его вложенное событие, затерянное от Selector, для удобного прослушивания всех дочерних выбранных событий.

Но, его не работает..., если я помещаю обработчик в Selected, и я создаю проект, я получаю сообщение об ошибке:

"ComboBox" не содержит определения для "Selected" и не может быть найден метод расширения "Selected", принимающий первый аргумент типа "ComboBox"

4b9b3361

Ответ 1

System.Windows.Controls.ComboBox наследует от System.Windows.Controls.Primitives.Selector, который имеет прикрепленное событие Selected.

Присоединенное событие позволяет присоединить обработчик для определенного события к некоторому дочернему элементу, а не к родительскому объекту, который фактически определяет событие, даже если ни объект, потенциально воспитывающий событие, ни экземпляр обработки адреса, не определяют или иным образом не владеют "это событие в их пространстве имен.

System.Windows.Controls.Primitives.Selector имеет поле SelectedEvent, которое поддерживает прикрепленное событие Selected.

Причина события Selected заключается в том, что вы можете добавить один обработчик события в элемент управления, который будет выполняться, когда какой-либо из многих дочерних элементов управления поднимет событие. Это гораздо удобнее, чем привязка обработчиков событий к каждому из ComboBoxItem.

Что касается того, почему он включен в редактор кода XAML intellisense; Я считаю, что это ошибка. Класс Selector имеет открытое поле для выбранного события:

public static readonly RoutedEvent SelectedEvent = EventManager.RegisterRoutedEvent( 
            "Selected", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Selector));

Но вы не можете добавить обработчик для события, потому что класс Selector не определяет событие, подобное этому:

public event RoutedEventHandler Selected
{ 
    add 
    {
        AddHandler(SelectedEvent, value); 
    }
    remove
    {
        RemoveHandler(SelectedEvent, value); 
    }
}

Поэтому нет смысла включать его в intellisense для ComboBox.

Но, ListBoxItem, который является базовым классом для ComboBoxItem, определяет событие для присоединения обработчиков, поэтому вы можете присоединить обработчики к ComboBoxItems

Ответ 2

Selected - это присоединенное событие, определенное в классе Selector, и предполагается использоваться с элементами Selectors. Обычно вы пишете:

<ListBoxItem Selector.Selected="OnSelected" />

Как показано ниже, ComboBox также может быть элементом, поэтому существует событие Selected, указанное в intellisense:

<ListBox x:Name="Selector">
    <ComboBox x:Name="Item1" />
    <ComboBox x:Name="Item2" />
</ListBox>

Однако combobox должен быть элементом другого селектора, чтобы использовать выбранное событие:

<ComboBox x:Name="Selector1" Selector.Selected="ThisDoesNotWork"/>
<ListBox x:Name="Selector2">
    <ComboBox x:Name="Item1" Selector.Selected="ThisShouldWorkButDoesnt"/>
     <!-- See edit -->
    <ComboBox x:Name="Item2" />
</ListBox>

и причина, почему вам не нужно писать Selector.Selected = "..", но только Selected = "..."? Потому что Combobox также является селектором. Аналогично, вам не нужно писать Grid.Column, а просто столбец, прикрепленный к Grid:

<Grid>
    <!-- Grid.Column="1" -->
    <Grid Column="1" />
</Grid>

По крайней мере, это объясняет поведение автозаполнения в визуальной студии.

EDIT: ни синтаксис Selector.Selected, ни Selected = ".." в элементах управления, унаследованных от Selector, не компилируется, вероятно, из-за ошибки в синтаксисе XAML. Но есть обходное решение, использующее именованное пространство имен xml:

<ListBox x:Name="Selector2"
         xmlns:p="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework">
    <ComboBox x:Name="Item1" p:Selector.Selected="Item1_Selected"/>