none
Databind a ListView dentro de otro ListView RRS feed

  • Pregunta

  • Hola a todos !!

    Estoy intentando hacer anidar un listview dentro de otro pero tengo problemas a la hora de añadir los datos al listview interno. 

    Los he declarado asi:

    <DataTemplate x:Key="nuevaLista">
                <StackPanel>
                    <ListView HorizontalAlignment="Stretch"
                  HorizontalContentAlignment="Stretch"
                  MinWidth="100"
                  MinHeight="100"
                   >
                        <ListView.View>
                            <GridView>
                                <GridViewColumn
                  Width="200"
                 DisplayMemberBinding="{Binding Path=nombre}" >
                                    <GridViewColumn.Header>
                                        <GridViewColumnHeader Tag="Nombre">Nombre</GridViewColumnHeader>
                                    </GridViewColumn.Header>
                                </GridViewColumn>
                                <GridViewColumn
                  Width="200"
                 DisplayMemberBinding="{Binding Path=nombreProyecto}" >
                                    <GridViewColumn.Header>
                                        <GridViewColumnHeader Tag="Proyecto" >Proyecto</GridViewColumnHeader>
                                    </GridViewColumn.Header>
                                </GridViewColumn>
                            </GridView>
                        </ListView.View>
                    </ListView>
                </StackPanel>
            </DataTemplate>
    <ListView Name="listView" Margin="0,90,0,0"  ItemTemplate="{StaticResource nuevaLista}" ></ListView>

    Esta es la clase que utilizo para los datos:

    public class prueba
        {
            public string nombre { get; set; }
            public string nombreProyecto { get; set; }
             
        }

    Y asi lo asigno al listview:

    ObservableCollection<prueba> lp = new ObservableCollection<prueba>();
                prueba p1 = new prueba();
                p1.nombre = "A";
                p1.nombreProyecto = "1";
                prueba p2 = new prueba();
                p2.nombre = "A";
                p2.nombreProyecto = "1";
                prueba p3 = new prueba();
                p3.nombre = "A";
                p3.nombreProyecto = "1";
                lp.Add(p1);
                lp.Add(p2);
                lp.Add(p3);
                listView.Items.Clear();
                listView.ItemsSource = lp;

    Se me muestran 3 listviews "internos" pero vacios y no se por que.

    Muchas gracias.

    Un saludo

    martes, 2 de agosto de 2016 15:34

Todas las respuestas

  • Hola Jk_rod, no veo una buena práctica en lo que estás proponiendo. Sobre todo porque por cada item del ListView estás cargando otro ListView. Es como tener un for dentro de otro. Me parece innecesario.

    El ItemTemplate de tu ListView debería ser sóloel StackPanel y dentro un TextBlock (que corresponde al item que quieres mostrar).

    De esa manera te funcionará. Pero si crees que es correcto lo que plantes en tu DataTemplate deberías enlazar a datos nuevamente:

    <DataTemplate x:Key="nuevaLista">
                <StackPanel>
                    <ListView HorizontalAlignment="Stretch"
                  HorizontalContentAlignment="Stretch"
                  MinWidth="100"
                  MinHeight="100"
                  ItemSource="{TemplateBinding ItemSource}"
                   >
                        <ListView.View>
                            <GridView>
                                <GridViewColumn
                  Width="200"
                 DisplayMemberBinding="{Binding Path=nombre}" >
                                    <GridViewColumn.Header>
                                        <GridViewColumnHeader Tag="Nombre">Nombre</GridViewColumnHeader>
                                    </GridViewColumn.Header>
                                </GridViewColumn>
                                <GridViewColumn
                  Width="200"
                 DisplayMemberBinding="{Binding Path=nombreProyecto}" >
                                    <GridViewColumn.Header>
                                        <GridViewColumnHeader Tag="Proyecto" >Proyecto</GridViewColumnHeader>
                                    </GridViewColumn.Header>
                                </GridViewColumn>
                            </GridView>
                        </ListView.View>
                    </ListView>
                </StackPanel>
            </DataTemplate>
    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.
    My Blog
    My code samples

    martes, 2 de agosto de 2016 17:26
  • Hola Jk_rod, no veo una buena práctica en lo que estás proponiendo. Sobre todo porque por cada item del ListView estás cargando otro ListView. Es como tener un for dentro de otro. Me parece innecesario.

    El ItemTemplate de tu ListView debería ser sóloel StackPanel y dentro un TextBlock (que corresponde al item que quieres mostrar).

    De esa manera te funcionará. Pero si crees que es correcto lo que plantes en tu DataTemplate deberías enlazar a datos nuevamente:

    <DataTemplate x:Key="nuevaLista">
                <StackPanel>
                    <ListView HorizontalAlignment="Stretch"
                  HorizontalContentAlignment="Stretch"
                  MinWidth="100"
                  MinHeight="100"
                  ItemSource="{TemplateBinding ItemSource}"
                   >
                        <ListView.View>
                            <GridView>
                                <GridViewColumn
                  Width="200"
                 DisplayMemberBinding="{Binding Path=nombre}" >
                                    <GridViewColumn.Header>
                                        <GridViewColumnHeader Tag="Nombre">Nombre</GridViewColumnHeader>
                                    </GridViewColumn.Header>
                                </GridViewColumn>
                                <GridViewColumn
                  Width="200"
                 DisplayMemberBinding="{Binding Path=nombreProyecto}" >
                                    <GridViewColumn.Header>
                                        <GridViewColumnHeader Tag="Proyecto" >Proyecto</GridViewColumnHeader>
                                    </GridViewColumn.Header>
                                </GridViewColumn>
                            </GridView>
                        </ListView.View>
                    </ListView>
                </StackPanel>
            </DataTemplate>
    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.
    My Blog
    My code samples

    Gracias Christian por tu respuesta, si me dices que es mejor que utilice el textblock, asi lo hare.

    Simplemente con el Stackpanel y los textblock correspondientes con la propiedad Text de la siguiente manera ?

                    <TextBlock Text="{Binding Path=nombreProyecto}" />


    EDIT:

    He probado a utilizar a un textblock pero necesito que cada item en el listview tenga su propia cabecera.

    La estructura visual que tengo pensada implementar es la siguiente:

    LISTVIEW ( Sin cabecera ) 

    GroupStyle con expander

    Listview (Con cabecera)

    Items

    No se muy bien si la primera opcion que puse en el OP es la correcta para seguir este camino

    • Editado Jk_rod miércoles, 3 de agosto de 2016 8:41
    miércoles, 3 de agosto de 2016 7:56