Я думаю, что мог бы найти решение. У комбинированных списков есть событие DropDownClosed - проблема в том, что это не RoutedEvent, поэтому вы не можете создать стиль для ComboBox и заставить их всех наследовать событие через EventSetter. (Вы получаете ошибку 'DropDownClosed' must be a RoutedEvent registered with a name that ends with the keyword "Event"
)
Однако, событие Loaded
является объектом RoutedEvent, поэтому мы можем подключиться к нему в стиле:
<Style x:Key="ComboBoxCellStyle" TargetType="ComboBox">
<EventSetter Event="Loaded" Handler="ComboBox_Loaded" />
</Style>
Теперь, когда у нас есть событие, которое всегда будет срабатывать, прежде чем что-либо еще будет сделано с ComboBox, мы можем подключиться к событию, которое нас действительно волнует:
private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
((ComboBox)sender).DropDownClosed -= ComboBox_OnDropDownClosed;
((ComboBox)sender).DropDownClosed += new System.EventHandler(ComboBox_OnDropDownClosed);
}
Теперь, когда у меня наконец есть доступ к событию, которое срабатывает, когда закрывается DropDown, я могу выполнять любые необходимые мне действия, чтобы убедиться, что фокус завершен на надоедливом ComboBox. В моем случае следующее:
void ComboBox_OnDropDownClosed(object sender, System.EventArgs e)
{
FrameworkElement visualElement = (FrameworkElement)sender;
while( visualElement != null && !(visualElement is DataCell) )
visualElement = (FrameworkElement)visualElement.TemplatedParent;
if( visualElement is DataCell )
{
DataCell dataCell = (DataCell)visualElement;
dataCell.EndEdit();
if( !(dataCell.ParentRow is InsertionRow) ) dataCell.ParentRow.EndEdit();
}
}
У меня был ComboBox в качестве шаблона DataCell в GridView, и эта конкретная проблема не позволяла DataRow завершить редактирование, когда пользователь открыл ComboBox, а затем щелкнул за пределами сетки.
Это была моя самая большая проблема с этой ошибкой. Вторичная проблема установки фокуса в этом событии если пользователь нажал. Возможно, этот комбинированный список также был закрыт, потому что пользователь нажал на вкладку или ушел, поэтому мы не можем просто установить фокус на положение мыши. Нам нужно больше информации о том, что вызвало событие DropDownClosed. Вероятно, подразумевает подключение к более не маршрутизированным событиям в обработчике событий _Loaded.