Переопределение имени элемента управления для целей чтения с экрана

У меня есть элемент управления WPF DataGrid, который привязывается к коллекции объектов. Все отображается на экране так, как должно быть.

ToString() был переопределен из-за требований в другом месте приложения.

Проблема в том, что при чтении с помощью программы чтения с экрана (например, встроенного экранного диктора Microsoft) или при проверке с помощью такого инструмента, как AccChecker/Inspect, значение name элемента управления является переопределенным значением ToString.

Я хочу иметь возможность указать описательное имя для программы чтения с экрана, но я не могу найти способ сделать это. Я пытался установить AutomationProperties.Name, AutomationProperties.ItemType и т. д., но ни одно из свойств в AutomationProperties не дало желаемого эффекта.

В идеале я мог бы сделать это как для самого элемента данных, так и для отдельных элементов столбцов.

Вот полная демонстрация проблемы, с которой я столкнулся:

<DataGrid x:Name="dgTest" ItemsSource="{Binding}" AutoGenerateColumns="false" AutomationProperties.Name="Test">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Name" IsReadOnly="True" Width="2*" AutomationProperties.Name="Test2">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=Name}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="ID" IsReadOnly="True" Width="2*">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=Id}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

И код:

public class FooItem
{
    public Guid Id { get; set; }
    public string Name { get; set; }

    public override string ToString()
    {
        return string.Concat(Id.ToString(), " : ", Name);
    }
}

public partial class MainWindow : Window
{
    public readonly List<FooItem> fooList = new List<FooItem>();
    public MainWindow()
    {
        fooList.Add(new FooItem { Id = Guid.NewGuid(), Name = "Test 1" });
        fooList.Add(new FooItem { Id = Guid.NewGuid(), Name = "Test 2" });
        fooList.Add(new FooItem { Id = Guid.NewGuid(), Name = "Test 3" });

        InitializeComponent();
        dgTest.DataContext = fooList;
    }
}

И просто для полноты картины вот скриншот Inspector. полноразмерное изображение Скриншот инспектора


person Daniel Mann    schedule 31.01.2012    source источник
comment
можете ли вы применить DataGrid.RowStyle, который связывает свойство Name DataGridRow со значением в вашем классе FooItem?   -  person Jake Berger    schedule 02.02.2012


Ответы (1)


Я нашел решение... Мне пришлось использовать стиль для DataGrid.ItemContainerStyle и DataGridTemplateColumn.HeaderStyle, чтобы установить AutomationProperties.Name.

Ex:

<DataGrid x:Name="dgTest" ItemsSource="{Binding}" AutoGenerateColumns="false" AutomationProperties.Name="Test"> 
    <DataGrid.ItemContainerStyle>
         <Style>
              <Setter Property="AutomationProperties.Name" Value="Row Item" />
         </Style>
    </DataGrid.ItemContainerStyle>
    <DataGrid.Columns> 
        <DataGridTemplateColumn Header="Name" IsReadOnly="True" Width="2*" AutomationProperties.Name="Test2"> 
            <DataGridTemplateColumn.CellTemplate> 
                <DataTemplate> 
                    <TextBlock Text="{Binding Path=Name}"/> 
                </DataTemplate> 
            </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
            <DataGridTemplateColumn Header="ID" IsReadOnly="True" Width="2*"> 
            <DataGridTemplateColumn.CellTemplate> 
                <DataTemplate> 
                    <TextBlock Text="{Binding Path=Id}"/> 
                </DataTemplate> 
            </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid>
person Daniel Mann    schedule 04.02.2012