Eibi
Eibi

Reputation: 400

WPF - how to prevent duplicated AutomationId in DataTemplate

I am using AutomationId and white for testing and I have encountered a problem recently that arrived from the automation team due to failure of some tests consistently.

I have some DataTemplate:

<DataTemplate DataType="{x:Type local:SomeDataModel}">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding NameTitle}" AutomationProperties.AutomationId="NameTitleId"/>
        <TextBlock Text="{Binding Name}" AutomationProperties.AutomationId="NameId"/>
        <Button Content="Apply" Command="{Binding ApplyCommand}" AutomationProperties.AutomationId="ApplyCommandId"/>
    </StackPanel>
</DataTemplate>

When creating the AutomationId's, the inner controls recieve AutomationId's, but that means that every instance of that DataTemplate that is being created, all AutomationId's will be duplicated.

This causes tests to fail due to clicking of reading from the wrong control.

Any idea?

Upvotes: 0

Views: 1384

Answers (2)

Nick Jugganaikloo
Nick Jugganaikloo

Reputation: 1

If your data model has a unique id you can bind to it like so. (Let's assume Name is unique).

<DataTemplate DataType="{x:Type local:SomeDataModel}">
  <StackPanel Orientation="Horizontal">
    <TextBlock Text="{Binding NameTitle}"
               AutomationProperties.AutomationId="{Binding Name,StringFormat='NameTitleTextBlockFor_{0}'}"/>
    <TextBlock Text="{Binding Name}"
               AutomationProperties.AutomationId="{Binding Name,StringFormat='NameTextBlockFor_{0}'}"/>
    <Button Content="Apply" Command="{Binding ApplyCommand}"
            AutomationProperties.AutomationId="{Binding Name,StringFormat='ApplyButtonFor_{0}'}"/>
  </StackPanel>
</DataTemplate>

Upvotes: 0

l33t
l33t

Reputation: 19996

Just add your automation IDs as properties in SomeDataModel and bind to them:

<DataTemplate DataType="{x:Type local:SomeDataModel}">
  <StackPanel Orientation="Horizontal">
    <TextBlock Text="{Binding NameTitle}"
               AutomationProperties.AutomationId="{Binding NameTitleId}"/>
    <TextBlock Text="{Binding Name}"
               AutomationProperties.AutomationId="{Binding NameId}"/>
    <Button Content="Apply" Command="{Binding ApplyCommand}"
            AutomationProperties.AutomationId="{Binding ApplyCommandId}"/>
  </StackPanel>
</DataTemplate>

Upvotes: 0

Related Questions