如何在 GridViewHeaderItem 上设置 AutomationProperties.Name?

How Can I Set AutomationProperties.Name on a GridViewHeaderItem?

我的应用程序中有一个 Grouped GridView。我想在 GridViewHeaderItem 对象上设置 AutomationProperties.Name,我可以使用 <Style> 来实现,如下所示:

<Style x:Key="GridViewHeaderStyle" TargetType="GridViewHeaderItem">
    <Setter Property="AutomationProperties.Name" Value="This Works" />
</Style>

以下 工作,无论我绑定到什么:

<Style x:Key="GridViewHeaderStyle" TargetType="GridViewHeaderItem">
    <Setter Property="AutomationProperties.Name" Value="{Binding DataContext.PropertyDoesNotWork}" />
</Style>

如何将 AutomationProperties.Name 设置为 运行 时间?创建 GridViewHeaderItem 对象时是否会触发某些事件?

谢谢。

不在 Style 中指定名称,而是定义 GridView.GroupStyle 的 HeaderTemplate 并在那里使用数据绑定

<Grid AutomationProperties.Name="{Binding MyNameProperty}"> 
   ...
</Grid>

解决方案:AutomationPeers

下面是我如何能够在运行时在 GridViewHeaderItem 上设置 AutomationProperties.Name,而无需使用 VisualTreeHelper。基本上,我使用 AutomationPeer 类 获取对 GridViewHeaderItem 的引用,然后以这种方式设置 AutomationProperties.Name。

Control.xaml

<GridView ...>
    <GridView.GroupStyle>
        <GroupStyle ...>
            <GroupStyle.HeaderTemplate>
                <DataTemplate>
                    <!-- Important to handle the Loaded event -->
                    <TextBlock Loaded="TextBlockLoaded" Text="Hi" />
                </DateTemplate>
            </GroupStyle.HeaderTemplate>
        </GroupStyle>
    </GridView.GroupStyle>
</GridView>

Control.xaml.cs

private void TextBlockLoaded(object sender, RoutedEventArgs e)
{
    var textBlockAP = FrameworkElementAutomationPeer.CreatePeerForElement(sender as UIElement);
    if (textBlockAP != null) 
    {
        var parentAP = textBlockAP.Navigate(AutomationNavigationDirection.Parent);
        if (parentAP is GridViewHeaderItemAutomationPeer gridViewHeaderItemAP)
        {
            var gridViewHeaderItem = gridViewHeaderItemAP.Owner as GridViewHeaderItem;
            var itemGroup = gridViewHeaderItem.Content as SomeItemGroupClass;
            AutomationProperties.SetName(gridViewHeaderItem, itemGroup.Title ?? string.Empty);
        }
    }
}

这对我非常具体的用例来说非常有效。