2012-01-31 9 views
3

私は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; 
    } 
} 

そして、ちょうど完全を期すため、ここでのインスペクタのスクリーンショットです。 full size image Inspector screenshot

+0

あなたは 'FooItem'クラスの値に' DataGridRow'の 'name'のプロパティをバインドする' DataGrid.RowStyle'を適用することができますか? –

答えて

3

は私がAutomationProperties.Nameを設定するDataGrid.ItemContainerStyleDataGridTemplateColumn.HeaderStyle上のスタイルを使用していた...解決策を見つけました。

例:

<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> 
関連する問題