none
Identificar cuántos CheckBox hay en un ContentControl - Silverlight RRS feed

  • Pregunta

  • Tengo creados 4 DataTemplates similares, cada uno de ellos contiene cierta cantidad de CheckBox, dependiendo de alguna propiedad asigno a un ContentControl alguno de estos DataTemplates

    Quiero hacer un procedimiento que identifique cuáles CheckBox están seleccionados, así que necesito saber cuántos CheckBox hay en el ContentControl en un momento dado, cómo puedo hacer esto??

    Pongo código muestra:

    Uno de los DataTemplate:

            <DataTemplate x:Name="chkCantidadLlantas4" DataType="ContentControl">
                <Grid Name="grdLlantas">
                    <Border Name="borLlantas" BorderBrush="Black" BorderThickness="1" Margin="0,0,0,0" Background="DarkSeaGreen" />
                    <CheckBox Content="2" Name="chk2" Grid.Column="1" Margin="20,20,20,20"  Checked="CheckBox_Checked" />
                    <CheckBox Content="1" Name="chk1" Grid.Column="1" Margin="20,60,20,20"  Checked="CheckBox_Checked"/>
                    <CheckBox Content="4" Name="chk4" Grid.Column="1" Margin="80,20,20,20"  Checked="CheckBox_Checked"/>
                    <CheckBox Content="3" Name="chk3" Grid.Column="1" Margin="80,60,20,20"  Checked="CheckBox_Checked"/>
                </Grid>
            </DataTemplate>

    El ContentControl:

    <ContentControl Name="chk" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"/>

    Desde behind code, según corresponda:

    chk.ContentTemplate = chkCantidadLlantas4;

    yo quisiera hacer algo así como:

    Por cada CheckBox que exista en el ContentControl:

         ¿está el CheckBox (n) seleccionado? => ....

    Donde n vaya de 1 a la cantidad de checkbox que tenga el ContentControl en el momento

    Alguien me puede orientar? Saludos y gracias



    cyndyrdz

    miércoles, 8 de octubre de 2014 19:49

Respuestas

  • Tal vez ese Grid complique un poco las cosas... A mi parecer.

    Prueba este metodo, la respuesta que tiene 14 votaciones. Yo utilizo un método parecido pero es de Telerik, por lo tanto no te funcionará.

    Saludos.


    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    MCP Profile

    jueves, 9 de octubre de 2014 16:30

Todas las respuestas

  • Hola Cynthia, creo que este tutorial (en inglés) puede ayudarte, pues tienes que buscar los elementos dentro del árbol visual.

    Espero sea útil.

    Saludos.


    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    MCP Profile

    jueves, 9 de octubre de 2014 13:07
  • Muchas gracias Christian Amado ya antes lo estuve viendo pero no sé si estoy haciendo mal algo, pero en el ejemplo que puse la instrucción VisualTreeHelper.GetChildrenCount(chk); me regresa 1, chk es mi ContentControl al que le asigno el ContentTemplate correspondiente, y pues dentro de el están todos los CheckBox, no entiendo...


    cyndyrdz

    jueves, 9 de octubre de 2014 13:47
  • Pero fíjate que el chk tiene dentro un Grid y dentro del Grid tiene los Checkboxes que estás buscando.

    De todos modos encontré un ejemplo que te será mucho más útil.

    Saludos.


    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    MCP Profile

    jueves, 9 de octubre de 2014 13:53
  • ok, muchas gracias, déjame lo reviso despacio, saludos


    cyndyrdz

    No le entiendo nada... :(

    traté de ponerlo en un ejemplo y me marca errores, y como no lo entiendo, pues no se dónde moverle...

    output.AddRange((ch as FrameworkElement).AllChildren<T>(whereFunc));
    " 'Sysem.Windows.FrameworkElement' no contiene una una definición de 'AllChildren' ni se encontró ningún método de extensión 'AllChildren' que acepte un primer argumento de tipo 'System.Windows.FrameworkElement' "
    foreach (var c in panel.AllChildren<Control>((child) => !(child is TreeViewItem)))
    {
        VisualStateManager.GoToState(c, "FlowSelected", true);
    } 
    "El nombre panel no existe en el contexto actual", supuse que sería el objeto que voy a revisar, así que en mi caso se me ocurrió poner chk, o LayoutRoot, pero luego me marca que no tienen un .AllChildren
     
    En esta parte además cambié FdTreeViewItem por TreeViewItem porque también marcaba que no existía...
    jueves, 9 de octubre de 2014 14:11
  • también revisé este ejemplo http://leeontech.wordpress.com/2008/09/24/getting-the-control-inside-a-datatemplate/ se veía bastante bien y bajé el código, y cuando lo corro me marca que el objeto es null y no hace nada ¿?

    cyndyrdz

    jueves, 9 de octubre de 2014 15:30
  • Tal vez ese Grid complique un poco las cosas... A mi parecer.

    Prueba este metodo, la respuesta que tiene 14 votaciones. Yo utilizo un método parecido pero es de Telerik, por lo tanto no te funcionará.

    Saludos.


    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    MCP Profile

    jueves, 9 de octubre de 2014 16:30
  • Muchas gracias por todo el apoyo Christian Amado, en mi caso puse:

    var checkBoxes = GetChildrenRecursively(LayoutRoot).OfType<CheckBox>();

    lo implementé, y al correrlo e inspeccionar checkBoxes me dice que es null ¿?

    luego cómo hago el foreach para preguntar por los CheckBox que encuentre??


    cyndyrdz

    jueves, 9 de octubre de 2014 18:22
  • Muchas gracias por todo el apoyo Christian Amado, en mi caso puse:

    var checkBoxes = GetChildrenRecursively(LayoutRoot).OfType<CheckBox>();

    lo implementé, y al correrlo e inspeccionar checkBoxes me dice que es null ¿?

    luego cómo hago el foreach para preguntar por los CheckBox que encuentre??


    cyndyrdz

    En lugar de LayoutRoot ¿no debería ser chk (que es tu ContentControl)?

    Saludos y a las órdenes.


    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    MCP Profile

    jueves, 9 de octubre de 2014 18:26
  • Muchas gracias otra vez Christian Amado, ya quedó, la última parte, con lo que estoy probando, fue así:

    var checkBoxes = GetChildrenRecursively(chk).OfType<CheckBox>();
    foreach (var checkBox in checkBoxes)
    {
        if (checkBox.IsChecked == true)
        {
            MessageBox.Show("El CheckBox " + checkBox.Content + " está marcado");
        }
    }

    y funciona muy bien!!

    Saludos!


    cyndyrdz

    jueves, 9 de octubre de 2014 19:01
  • Muchas gracias otra vez Christian Amado, ya quedó, la última parte, con lo que estoy probando, fue así:

    var checkBoxes = GetChildrenRecursively(chk).OfType<CheckBox>();
    foreach (var checkBox in checkBoxes)
    {
        if (checkBox.IsChecked == true)
        {
            MessageBox.Show("El CheckBox " + checkBox.Content + " está marcado");
        }
    }

    y funciona muy bien!!

    Saludos!


    cyndyrdz


    ¡Genial!

    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    MCP Profile

    jueves, 9 de octubre de 2014 19:08