XAML-привязка индекса строки и столбца ячейки к идентификатору автоматизации
Я в процессе предоставления идентификаторов автоматизации отдельным ячейкам в WPF datagrid, но я попал в небольшую загвоздку. Я решил попробовать назвать ячейки в соответствии с их положением в сетке (индекс строки и индекс столбца). С помощью инспектора UI и выделяя одну из DataGridCells в вопрос показывает следующие свойства:
GridItem.Row: 2
GridItem.Column: 0
... это заставляет меня поверить, что я могу получить доступ к этим свойствам через привязку. Тем не менее, я потратил большая часть последних нескольких дней прочесывает Интернет, чтобы узнать, как это сделать, но ничего не нашел.
текущий код XAML выглядит следующим образом ('??? являются заполнителями):
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="AutomationProperties.AutomationId">
<Setter.Value>
<MultiBinding StringFormat="cell:{0}-{1}">
<Binding ??? />
<Binding ??? />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</DataGrid.CellStyle>
существует ли такой путь к этим свойствам? Или существует другой метод для предоставления уникальных идентификаторов автоматизации отдельным ячейкам? Я не очень опытен с WPF и XAML, поэтому любые указатели приветствуются.
спасибо заранее.
2 ответов
получил его на работу, наконец. Размещение решения здесь, чтобы другие могли извлечь выгоду.
код позади (на основе выкл http://gregandora.wordpress.com/2011/01/11/wpf-4-datagrid-getting-the-row-number-into-the-rowheader/):
Private Sub DataGrid_LoadingRow(sender As System.Object, e As System.Windows.Controls.DataGridRowEventArgs)
e.Row.Tag = (e.Row.GetIndex()).ToString()
End Sub
и XAML:
<DataGrid ... LoadingRow="DataGrid_LoadingRow" >
<DataGrid.ItemContainerStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="AutomationProperties.AutomationId">
<Setter.Value>
<MultiBinding StringFormat="Row{0}">
<Binding Path="(DataGridRow.Tag)"
RelativeSource="{RelativeSource Mode=Self}" />
</MultiBinding>
</Setter.Value>
</Setter>
<Setter Property="AutomationProperties.Name">
<Setter.Value>
<MultiBinding StringFormat="Row{0}">
<Binding Path="(DataGridRow.Tag)"
RelativeSource="{RelativeSource Mode=Self}" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</DataGrid.ItemContainerStyle>
...
<DataGrid.CellStyle>
<Style>
<Setter Property="AutomationProperties.AutomationId">
<Setter.Value>
<MultiBinding StringFormat="cell{0}Col{1}">
<!-- bind to row automation name (which contains row index) -->
<Binding Path="(AutomationProperties.Name)"
RelativeSource="{RelativeSource AncestorType=DataGridRow}" />
<!-- bind to column index -->
<Binding Path="(DataGridCell.TabIndex)"
RelativeSource="{RelativeSource Mode=Self}" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</DataGrid.CellStyle>
...
</DataGrid>
Ok, Я проверил его (не с datagrid, а с grid, он должен быть таким же), и он работает:
<AutomationProperties.AutomationId>
<MultiBinding StringFormat="{}{0} - {1}">
<Binding Path="(Grid.Row)" RelativeSource="{RelativeSource Mode=Self}" />
<Binding Path="(Grid.Column)" RelativeSource="{RelativeSource Mode=Self}" />
</MultiBinding>
</AutomationProperties.AutomationId>