Вот как я решил ту же проблему в своем коде, надеясь, что она может быть полезна для кого-то другого, или просто шаг к полному решению xaml.
Я последовал решению Квартмейстера. Но, на мой взгляд, необходимость в создании подклассов ComboBox является недостатком дизайна (поскольку это делается только для обработки события MouseOver). Поскольку мне нужно просто другое поведение события MouseOver, я реализовал только метод, который обрабатывает события MouseOver в классе, присоединенном к файлу XAML.
Прежде всего, я использовал класс EventSetter , который подкласс класса Setter и он специфичен для событий. Таким образом, EventSetter может использоваться для украшения FrameworkElements, как мы обычно делаем с Setter.
<ComboBox>
<ComboBox.ItemContainerStyle>
<Style TargetType="{x:Type ComboBoxItem}">
<EventSetter Event="MouseMove" Handler="_updateModel"/>
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
Таким образом, каждый ComboBoxItem вызывает _updateModel, когда мышь наводит на него курсор.
Моя реализация _updateModel довольно прямая, она основана на работе Quartermeister:
private void _updateModel(object sender, MouseEventArgs e)
{
DependencyObject src = e.Source as DependencyObject;
ComboBoxItem cbi = VisualTreeHelper.GetParent(src) as ComboBoxItem;
while ((cbi == null) && (src!=null))
{
src = VisualTreeHelper.GetParent(src);
cbi = src as ComboBoxItem;
}
if (cbi != null)
{
ComboBox cb = ItemsControl.ItemsControlFromItemContainer(cbi) as ComboBox;
if (cb != null)
{
var container = cb.ContainerFromElement((DependencyObject)e.OriginalSource);
if (container != null)
{
cb.SelectedItem = cb.ItemContainerGenerator.ItemFromContainer(container);
}
}
}
}
В других способах решения тех же проблем можно использовать поведение blend
по причинам, которые здесь не стоит объяснять, я не мог использовать это поведение.