Como utilizar LINQ para levantar un handler para varios controles.

Cuantas veces no hemos escrito “n” líneas de código solo  para dar a distintos controles una tarea en específico sin saber que tal vez se pueda hacer en una.

Bueno… no prometo nada pero aquí propongo un ejemplo de como podríamos solucionar (o mejor dicho, eficientizar este proceso) este problema.

Supongamos que tenemos 3 botones en nuestro LayoutRoot en nuestro control de inicio, algo así:

3botones

  1. <Grid x:Name="LayoutRoot" Background="White">
  2.         <Grid.ColumnDefinitions>
  3.             <ColumnDefinition/>
  4.             <ColumnDefinition/>
  5.         </Grid.ColumnDefinitions>
  6.         <Grid.RowDefinitions>
  7.             <RowDefinition/>
  8.             <RowDefinition/>
  9.         </Grid.RowDefinitions>
  10.         <Button x:Name="btn1" Width="100" Height="25" Content="Botón 1"
  11.                VerticalAlignment="Center" HorizontalAlignment="Center"/>
  12.         <Button x:Name="btn2" Width="100" Height="25" Content="Botón 2" Grid.Column="1"
  13.                VerticalAlignment="Center" HorizontalAlignment="Center"/>
  14.         <Button x:Name="btn3" Width="100" Height="25" Content="Botón 3" Grid.Row="1"
  15.                VerticalAlignment="Center" HorizontalAlignment="Center"/>
  16.     </Grid>

 

Normalmente le asociaríamos los eventos de la siguiente forma:

  1. public MainPage()
  2.         {
  3.             InitializeComponent();
  4.  
  5.  
  6.             btn1.Click += new RoutedEventHandler(btn1_Click);
  7.             btn2.Click += new RoutedEventHandler(btn2_Click);
  8.             btn3.Click += new RoutedEventHandler(btn3_Click);
  9.         }
  10.  
  11.         void btn1_Click(object sender, RoutedEventArgs e)
  12.         {
  13.             throw new NotImplementedException();
  14.         }
  15.  
  16.         void btn2_Click(object sender, RoutedEventArgs e)
  17.         {
  18.             throw new NotImplementedException();
  19.         }
  20.  
  21.         void btn3_Click(object sender, RoutedEventArgs e)
  22.         {
  23.             throw new NotImplementedException();
  24.         }

 

O así:

  1.             btn1.Click += (a, b) => { /*Código a implementar*/ };
  2.             btn2.Click += (a, b) => { /*Código a implementar*/ };
  3.             btn3.Click += (a, b) => { /*Código a implementar*/ };

 

bueno, el propósito de este post es proponer algo de la siguiente forma:

  1. public MainPage()
  2. {
  3.     InitializeComponent();
  4.  
  5.     //De esta forma se levantan los handlers para todos lo botones
  6.     LayoutRoot.Children.ToList().ForEach(btn => ((Button)btn).Click += new RoutedEventHandler(btn_Click));
  7. }
  8.  
  9. void btn_Click(object sender, RoutedEventArgs e)
  10. {
  11.     //Identificamos quien lo manda a llamar
  12.     switch (((Button)sender).Name)
  13.     {
  14.         case "btn1":
  15.             //Código para botón 1
  16.             break;
  17.         case "btn2":
  18.             //Código para botón 2
  19.             break;
  20.         case "btn3":
  21.             //Código para botón 3
  22.             break;
  23.     }
  24. }

 

Y ya para terminar, como no todo es perfecto en esta vida puede ser que no solo tengamos botones en nuestro LayoutRoot, si no todo tipo de controles que al hacerle el parse a Button nos marcará un error. Por ello solo tendríamos que aplicar un “Where” a la lista de hijos del LayoutRoot:

  1. //De esta forma aseguramos que a todos los controles que le hagamos el parse sean botones
  2. LayoutRoot.Children.Where(btn => btn is Button).ToList()
  3.     .ForEach(btn => ((Button)btn).Click += new RoutedEventHandler(btn_Click));

 

Espero les sirva de ayuda. Nos leemos luego.

Leave a Reply

Tu dirección de correo electrónico no será publicada.