Я переопределил мой ComboBox
следующим образом:
<ComboBox AutomationProperties.AutomationId="Rm8Function"
ItemsSource="{Binding Source={StaticResource Functions}}"
SelectedItem="{Binding Function, UpdateSourceTrigger=PropertyChanged}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock
AutomationProperties.Name="{Binding Mode=OneTime, Converter={StaticResource FunctionEnumConverter}}"
Text="{Binding Mode=OneTime, Converter={StaticResource FunctionEnumConverter}}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Предоставление TextBlock
того же значения AutomationProperties.Name
, что и значение Text
.
Я также обновил свою функцию, которая выбирает элемент ComboBox, следующим образом:
public static void SelectComboBoxItem(this AutomationElement comboBox, string item)
{
var expandCollapsePattern = comboBox.GetPattern<ExpandCollapsePattern>(ExpandCollapsePatternIdentifiers.Pattern);
expandCollapsePattern.Expand();
expandCollapsePattern.Collapse();
var listItem = comboBox.FindFirst(TreeScope.Subtree,
new PropertyCondition(AutomationElement.NameProperty, item));
var walker = TreeWalker.ControlViewWalker;
var parent = walker.GetParent(listItem);
while (parent != comboBox)
{
listItem = parent;
parent = walker.GetParent(listItem);
}
var selectionItemPattern = listItem.GetPattern<SelectionItemPattern>(SelectionItemPatternIdentifiers.Pattern);
selectionItemPattern.Select();
}
Очевидно, что при использовании ComboBox
как есть, без переопределения ItemTemplate
, вышеприведенная функция находит своего непосредственного потомка, который является ListBoxItem
. Это ListBoxItem
, который можно выбрать с помощью шаблона SelectionItemPattern
. Но при переопределении ItemTemplate
функция вместо этого находит TextBlock
, который является дочерним по отношению к ListBoxItem
. Поэтому мне пришлось изменить свою функцию таким образом, чтобы она перемещалась вверх, пока не нашла непосредственного потомка для ComboBox
и не выбрала его.