[Desenvolvimento] Como obter acesso a controles dentro do ItemTemplate do ListBox

1

Olá pessoal, tudo bom?

Aproveito uma questão que me fizeram para escrever esse post que demonstra como obter acesso a controles que estão posicionados dentro do ItemTemplate de um determinado ListBox ou outro container qualquer.

Tomando por base a seguinte definição para um ListBox cuja finalidade seria exibir tipos de pizzas e seus respectivos ingredientes:

...
<StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
  <ListBox Name="lbSabores" Height="540" ItemsSource="{StaticResource MeusDados}">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <StackPanel>
          <CheckBox Height="Auto" Content="{Binding Nome}" IsChecked="{Binding Selecionado}" />
          <TextBlock Name="txtIngredientes" Height="Auto" Text="{Binding Ingredientes}" />
        </StackPanel>
      </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>
</StackPanel>
...

Considerando ainda a existência de um botão que irá destacar todos os TextBlocks que exibem os ingredientes das pizzas (trocar a cor do texto Foreground)

...
<button name="btnDestacar"></button>
...

Repare agora que utilizei um método genérico em C# que permite localizar controles dentro de um determinado container (no nosso caso o ListBox lbSabores), sendo que para o caso, faço uma pergunta buscando por um determinado TextBlock chamado txtIngredientes e, quando encontrado, troco a cor da fonte do mesmo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
...
private void Destacar(DependencyObject targetElement)
{
  var count = VisualTreeHelper.GetChildrenCount(targetElement);
  if (count == 0)
    return;
  for (int i = 0; i &lt; count; i++)
  {
    var child = VisualTreeHelper.GetChild(targetElement, i);
    if (child is TextBlock)
    {
      TextBlock targetItem = (TextBlock)child;
      if (targetItem.Name == "txtIngredientes")
      {
        targetItem.Foreground = new SolidColorBrush(Colors.Green);
        return;
      }
    }
    else
    {
      Destacar(child);
    }
  }
}
...

Agora, imaginando que o usuário toque no botão “Destacar Ingredientes” podemos chamar o método Destacar e passar para ele o ListBox que contem os elementos que queremos localizar.

1
2
3
4
5
6
...
private void btnDestacar_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
Destacar(lbSabores);
}
...

controles-localizar-wp

Espero ter ajudado!

Posts Relacionados: 

Grande abraço,
Eduardo Henrique Rizo (@eduardorizo)

Fonte: Blog do Eduardo H. Rizo

Share.

About Author

Bacharel em Ciência da Computação pela FIPP/Unoeste, Pós-Graduado em Desenvolvimento de Sistemas Web, Segurança da Informação e Avaliação do Ensino e da Aprendizagem, Professor universitário e responsável pelo setor de desenvolvimento de sistemas web da Universidade do Oeste Paulista. MCP e MCPS pela Microsoft e nas horas vagas dedica um pouco do seu tempo escrevendo posts técnicos sobre desenvolvimento de sistemas web, windows phone, gerenciamento de servidores e outros assuntos para a comunidade.

  • Oliver

    TrackRacing Online, exelente jogo de corrida com belos graficos e boa jogabilidade, esta gratuito na Marketplace americana !