如何在GridViewHeaderItem上设置AutomationProperties.Name?

4

我在我的应用程序中有一个分组的 GridView。我想要在 GridViewHeaderItem 对象上设置 AutomationProperties.Name,我可以使用以下类似的 <Style> 实现:

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

以下代码无论我绑定什么都不起作用:

does NOT

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

我该如何在运行时设置AutomationProperties.Name?是否有某个事件在创建GridViewHeaderItem对象时触发?

谢谢。


DOES_NOT_WORK 是否确实是 GridViewHeaderItem 的 DataContext 属性? - 15ee8f99-57ff-4f92-890c-b56153
@EdPlunkett 当然可以。我编辑了问题,希望更清晰明了。似乎在样式的Setter值中绑定不起作用。 - Chris Leyva
我认为之前已经很清楚了。但无论如何,你是正确的,恐怕那就是答案。 - 15ee8f99-57ff-4f92-890c-b56153
@EdPlunkett 是的,那就是我也找到的链接。谢谢你的尝试。如果可能的话,我正在寻找一种解决办法。 - Chris Leyva
2个回答

2

解决方案:自动化同行

以下是我如何在运行时设置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);
        }
    }
}

这对于我的特定使用情况非常有效。

1

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

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

这个答案是可行的,但如果您希望该属性在整个应用程序中保持一致呢?抱歉,我知道这不是OP的问题,只是好奇。 - Max Young
Max,如果你在App.Xaml中为GridView创建一个没有x:Key的样式,它将成为所有GridView的新默认样式。设置它的GroupStyle,它将应用于所有GridView实例。 - Michael S. Scherotter
很遗憾,这个方法不起作用。我在测试答案时弄错了,过早地将其标记为答案并分配了赏金。无论如何,这个方法不能设置GridViewHeaderItem上的AutomationProperty.Name,而Windows Narrator应用程序在焦点在控件上时使用它来读取控件的名称。我现在正在尝试其他想法来使它起作用。还是谢谢。 - Chris Leyva
@MichaelS.Scherotter,花了很长时间,但我终于能够发布对我有用的解决方案。再次感谢您的帮助。 - Chris Leyva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接