Esto es aproximadamente 100 veces más complicado de lo que necesita, pero finalmente lo tengo funcionando. El gran problema con el WPF ComboBox es que, en lo que respecta a Automatización, no parece tener ningún ListItems hasta que se haya ampliado el ComboBox.
El siguiente código usa el patrón Expandir contraer para desplegar momentáneamente la lista y luego colapsarla, luego puede usar FindFirst en el ComboBox para seleccionar ListItem y luego usar el patrón SelectionItem para seleccionarlo.
En el caso de la pregunta original, una selección de -1 significa que no hay elementos seleccionados. No hay un método para esto, pero podría simplemente usar FindAll para obtener una colección de ListItems, obtener el patrón SelectionItem para cada uno por turno y llamar a su método RemoveFromSelection.
public static void SetSelectedComboBoxItem(AutomationElement comboBox, string item)
{
AutomationPattern automationPatternFromElement = GetSpecifiedPattern(comboBox, "ExpandCollapsePatternIdentifiers.Pattern");
ExpandCollapsePattern expandCollapsePattern = comboBox.GetCurrentPattern(automationPatternFromElement) as ExpandCollapsePattern;
expandCollapsePattern.Expand();
expandCollapsePattern.Collapse();
AutomationElement listItem = comboBox.FindFirst(TreeScope.Subtree, new PropertyCondition(AutomationElement.NameProperty, item));
automationPatternFromElement = GetSpecifiedPattern(listItem, "SelectionItemPatternIdentifiers.Pattern");
SelectionItemPattern selectionItemPattern = listItem.GetCurrentPattern(automationPatternFromElement) as SelectionItemPattern;
selectionItemPattern.Select();
}
private static AutomationPattern GetSpecifiedPattern(AutomationElement element, string patternName)
{
AutomationPattern[] supportedPattern = element.GetSupportedPatterns();
foreach (AutomationPattern pattern in supportedPattern)
{
if (pattern.ProgrammaticName == patternName)
return pattern;
}
return null;
}
O http://msdn.microsoft.com/en-us/library/system.windows.automation.selectionitempattern_members%28v=vs.90 % 29.aspx si prefiere el inglés MSDN. – SteveWilkinson