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