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>