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"
Ответы
Ответ 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"/>