XAML - привязка индекса строки и столбца ячейки к идентификатору автоматизации - PullRequest
6 голосов
/ 26 января 2012

Я нахожусь в процессе предоставления идентификаторов автоматизации отдельным ячейкам в сетке данных WPF, но я столкнулся с небольшим затруднением. Я решил попробовать именовать ячейки в соответствии с их положением в сетке (индекс строки и индекс столбца). При использовании инспектора пользовательского интерфейса и выделении одного из рассматриваемых 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 ]

7 голосов
/ 03 февраля 2012

Наконец-то все заработало. Опубликуйте решение здесь, чтобы другие могли извлечь выгоду.

Код позади (основано на 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>
1 голос
/ 27 января 2012

Хорошо, я проверил (не с сеткой данных, а с сеткой, она должна быть такой же), и она работает:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...