none
Header LongListSelector RRS feed

  • Pregunta

  • Buenos días, 

    Tengo un problema para mostrar los nombres de los grupos en un LongListSelector.

    Me he descargado el toolkit con los ejemplos, tomando como base el ejemplo de "buddies" he escrito lo siguiente:

      <toolkit:LongListSelector x:Name="buddies" Background="Transparent"
                                              Margin="0,-8,0,0"
                                              GroupViewOpened="LongListSelector_GroupViewOpened"
                                              GroupViewClosing="LongListSelector_GroupViewClosing">
                    <toolkit:LongListSelector.GroupItemsPanel>
                        <ItemsPanelTemplate>
                            <toolkit:WrapPanel Orientation="Horizontal"/>
                        </ItemsPanelTemplate>
                    </toolkit:LongListSelector.GroupItemsPanel>
                    <toolkit:LongListSelector.GroupItemTemplate>
                        <DataTemplate>
                            <Border Background="#FFC0E239" 
                                        Width="99" Height="99" Margin="6" IsHitTestVisible="True">
                                <TextBlock Text="{Binding Key}" 
                                               FontFamily="{StaticResource PhoneFontFamilySemiBold}"
                                               FontSize="48"
                                               Margin="8,0,0,0"
                                                                                      
                                               VerticalAlignment="Bottom"/>
                                <Border.Projection>
                                    <PlaneProjection RotationX="-60"/>
                                </Border.Projection>
                            </Border>
                        </DataTemplate>
                    </toolkit:LongListSelector.GroupItemTemplate>
                    <toolkit:LongListSelector.GroupHeaderTemplate>
                        <DataTemplate>
                            <Border Background="Transparent" Margin="12,8,0,8">
                                <Border Background="#FFC0E239" 	
                                            Padding="8,0,0,0" Width="62" Height="62" 				 
                                            HorizontalAlignment="Left">
                                    <TextBlock Text="{Binding Path=Key}" 
                                                   Foreground="#FFFFFF" 
                                                   FontSize="48"
                                                   FontFamily="{StaticResource PhoneFontFamilySemiLight}"
                                                   HorizontalAlignment="Left"
                                                   VerticalAlignment="Bottom"/>
                                </Border>
                            </Border>
                        </DataTemplate>
                    </toolkit:LongListSelector.GroupHeaderTemplate>
                    <toolkit:LongListSelector.ItemTemplate>
                        <DataTemplate>
                            <Grid Margin="12,8,0,8">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>                         
                                <StackPanel Grid.Column="1" VerticalAlignment="Top">
                                    <TextBlock Text="{Binding nombre}" Style="{StaticResource PhoneTextLargeStyle}" FontFamily="{StaticResource PhoneFontFamilySemiBold}" Margin="12,-12,12,6"/>
                                </StackPanel>
                            </Grid>
                        </DataTemplate>
                    </toolkit:LongListSelector.ItemTemplate>
                </toolkit:LongListSelector>
    

    Ni el Textbox del GroupHeaderTemplate, ni el TextBox del GroupItemTemplate me muestran nada. Sin embargo los datos agrupados se muestran correctamente.

    El código que utilizo para cargar el ListBox es el siguiente:

    ...
     var grpClientes = clientes.OrderBy(x => x.nombre).GroupBy(y => y.nombre.First().ToString());
                buddies.ItemsSource = grpClientes;
    ...
    
    public class Cliente
        {
            private Guid _id;
            public Guid id { get { return _id; } set { _id = value; } }
            private string _nombre;
            public string nombre { get { return _nombre; } set { _nombre = value; } }
            public Cliente(string i, string n)
            {
                id = new Guid(i);
                nombre = n;
            }
    
        } 
    


    Con todo esto, el resultado es el siguiente, el control funciona perfectamente, pero en ninguno de los casos muestra los valores de las iniciales de los clientes.

     

     

    En un ejemplo del toolkit he visto que utilizan la clase publicgrouping, pero no sé como implementar algo parecido.

     var moviesByCategory = from movie in movies
                                       group movie by movie.Category into c
                                       orderby c.Key
                                       select new PublicGrouping<string, Movie>(c);
    


    Saludos

    lunes, 31 de octubre de 2011 12:50

Respuestas

  • Finalmente he encontrado en un foro en inglés la definición de la clase del ejemplo del toolkit y ha funcionado a la primera, la posteo aquí para el pueblo:

    Definición de la clase:

    public class PublicGrouping<TKey, TElement> : IGrouping<TKey, TElement>
        {
            private readonly IGrouping<TKey, TElement> _internalGrouping;
    
            /// <summary>
            /// Initializes a new instance of the <see cref="PublicGrouping&lt;TKey, TElement&gt;"/> class.
            /// </summary>
            /// <param name="internalGrouping">The internal grouping.</param>
            public PublicGrouping(IGrouping<TKey, TElement> internalGrouping)
            {
                _internalGrouping = internalGrouping;
            }
    
            /// <summary>
            /// Determines whether the specified <see cref="System.Object"/> is equal to this instance.
            /// </summary>
            /// <param name="obj">The <see cref="System.Object"/> to compare with this instance.</param>
            /// <returns>
            ///   <c>true</c> if the specified <see cref="System.Object"/> is equal to this instance; otherwise, <c>false</c>.
            /// </returns>
            public override bool Equals(object obj)
            {
                PublicGrouping<TKey, TElement> that = obj as PublicGrouping<TKey, TElement>;
    
                return (that != null) && (this.Key.Equals(that.Key));
            }
    
            /// <summary>
            /// Returns a hash code for this instance.
            /// </summary>
            /// <returns>
            /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. 
            /// </returns>
            public override int GetHashCode()
            {
                return Key.GetHashCode();
            }
    
    
            /// <summary>
            /// Gets the key.
            /// </summary>
            /// <value>The key.</value>
            public TKey Key
            {
                get { return _internalGrouping.Key; }
            }
    
    
            /// <summary>
            /// Gets the enumerator.
            /// </summary>
            /// <returns></returns>
            public IEnumerator<TElement> GetEnumerator()
            {
                return _internalGrouping.GetEnumerator();
            }
    
    
            /// <summary>
            /// Returns an enumerator that iterates through a collection.
            /// </summary>
            /// <returns>
            /// An <see cref="T:System.Collections.IEnumerator"/> object that can be used to iterate through the collection.
            /// </returns>
            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
            {
                return _internalGrouping.GetEnumerator();
            }
    
    
        }
    
    Rellenar el longlistselector:
    


     var grpClientes = clientes.OrderBy(x => x.nombre).GroupBy(y => y.nombre.First().ToString().ToUpper());
                var moviesByCategory = from cliente in clientes
                                       group cliente by cliente.nombre.First().ToString().ToUpper() into c
                                       orderby c.Key
                                       select new PublicGrouping<string, Cliente>(c);
                buddies.ItemsSource = moviesByCategory;
    


     


    • Editado jmmartinez miércoles, 2 de noviembre de 2011 10:11
    • Marcado como respuesta jmmartinez miércoles, 2 de noviembre de 2011 10:12
    miércoles, 2 de noviembre de 2011 10:11

Todas las respuestas

  • Hola!

    Te respondo de memoria, no tengo VS delante....

    Al realizar el grouping estas haciendo esto:

     var grpClientes = clientes.OrderBy(x => x.nombre).GroupBy(y => y.nombre.First().ToString());
                buddies.ItemsSource = grpClientes;

    En el groupBy le estás indicando que agrupe por el valor .Tostring() del primer nombre... prueba a hacer solo esto:

     var grpClientes = clientes.OrderBy(x => x.nombre).GroupBy(y => y.nombre);
                 buddies.ItemsSource = grpClientes;

    De esta forma debería funcionar perfectamente.

     

    Un saludo!


    MCTS - .NET 4.0 Windows Applications
    MCTS - .NET 4.0 Data Access
    MCTS - .NET 4.0 Service Communication Applications
    MCPD - .NET 4.0 Windows Developer
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    martes, 1 de noviembre de 2011 5:10
    Moderador
  • Hola Josue, así es como probé en un principio, le puse el "toString()", por si el binding de XAML, tenía algún problema con los objetos de tipo Char.

    Con la respuesta que me das, agruparía sobre el nombre completo. Yo quiero agrupar por la primera letra del nombre, de la misma manera que aparece en el Hub de contactos.

    Agrupando así

    ar grpClientes = clientes.OrderBy(x => x.nombre).GroupBy(y => y.nombre.First().ToString());
                buddies.ItemsSource = grpClientes;

    Funcionan bien las agrupaciones, pero no se muestran las letras de los grupos. Falla este binding.

    <TextBlock Text="{Binding Key}"
                                               FontFamily="{StaticResource PhoneFontFamilySemiBold}"
                                               FontSize="48"
                                               Margin="8,0,0,0"

    Gracias.
    martes, 1 de noviembre de 2011 9:58
  • Finalmente he encontrado en un foro en inglés la definición de la clase del ejemplo del toolkit y ha funcionado a la primera, la posteo aquí para el pueblo:

    Definición de la clase:

    public class PublicGrouping<TKey, TElement> : IGrouping<TKey, TElement>
        {
            private readonly IGrouping<TKey, TElement> _internalGrouping;
    
            /// <summary>
            /// Initializes a new instance of the <see cref="PublicGrouping&lt;TKey, TElement&gt;"/> class.
            /// </summary>
            /// <param name="internalGrouping">The internal grouping.</param>
            public PublicGrouping(IGrouping<TKey, TElement> internalGrouping)
            {
                _internalGrouping = internalGrouping;
            }
    
            /// <summary>
            /// Determines whether the specified <see cref="System.Object"/> is equal to this instance.
            /// </summary>
            /// <param name="obj">The <see cref="System.Object"/> to compare with this instance.</param>
            /// <returns>
            ///   <c>true</c> if the specified <see cref="System.Object"/> is equal to this instance; otherwise, <c>false</c>.
            /// </returns>
            public override bool Equals(object obj)
            {
                PublicGrouping<TKey, TElement> that = obj as PublicGrouping<TKey, TElement>;
    
                return (that != null) && (this.Key.Equals(that.Key));
            }
    
            /// <summary>
            /// Returns a hash code for this instance.
            /// </summary>
            /// <returns>
            /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. 
            /// </returns>
            public override int GetHashCode()
            {
                return Key.GetHashCode();
            }
    
    
            /// <summary>
            /// Gets the key.
            /// </summary>
            /// <value>The key.</value>
            public TKey Key
            {
                get { return _internalGrouping.Key; }
            }
    
    
            /// <summary>
            /// Gets the enumerator.
            /// </summary>
            /// <returns></returns>
            public IEnumerator<TElement> GetEnumerator()
            {
                return _internalGrouping.GetEnumerator();
            }
    
    
            /// <summary>
            /// Returns an enumerator that iterates through a collection.
            /// </summary>
            /// <returns>
            /// An <see cref="T:System.Collections.IEnumerator"/> object that can be used to iterate through the collection.
            /// </returns>
            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
            {
                return _internalGrouping.GetEnumerator();
            }
    
    
        }
    
    Rellenar el longlistselector:
    


     var grpClientes = clientes.OrderBy(x => x.nombre).GroupBy(y => y.nombre.First().ToString().ToUpper());
                var moviesByCategory = from cliente in clientes
                                       group cliente by cliente.nombre.First().ToString().ToUpper() into c
                                       orderby c.Key
                                       select new PublicGrouping<string, Cliente>(c);
                buddies.ItemsSource = moviesByCategory;
    


     


    • Editado jmmartinez miércoles, 2 de noviembre de 2011 10:11
    • Marcado como respuesta jmmartinez miércoles, 2 de noviembre de 2011 10:12
    miércoles, 2 de noviembre de 2011 10:11