locked
LongListSelector binding RRS feed

  • Question

  • Bonjour à vous,

    J'utilise un LongListSelector pour afficher des données groupées.

    Le problème que j'ai est que  mes HeaderGroup n'ont pas de texte comme si le Binding ne fonctionnait pas :

     <phone:PhoneApplicationPage.Resources>
            
            <DataTemplate x:Key="HeaderTemplate">
                <StackPanel VerticalAlignment="Top" Background="#FF9C0000">
                    <TextBlock Text="{Binding Name}" Margin="8,0,0,0" FontSize="30" Foreground="White" />
                </StackPanel>
            </DataTemplate>
    
            <DataTemplate x:Key="ItemTemplate">
                <StackPanel Orientation="Horizontal" Grid.Row="0" VerticalAlignment="Top">
                    <TextBlock Text="{Binding Id}" FontSize="25"  />
                    <TextBlock Text="{Binding Name}" Margin="8,0,0,0" FontSize="25" />
                </StackPanel>
            </DataTemplate>
    
            <phone:JumpListItemBackgroundConverter x:Key="BackgroundConverter"/>
            <phone:JumpListItemForegroundConverter x:Key="ForegroundConverter"/>
            <Style x:Key="LongListSelectorJumpListStyle" TargetType="phone:LongListSelector">
                <Setter Property="GridCellSize"  Value="113,113"/>
                <Setter Property="LayoutMode" Value="Grid" />
                <Setter Property="ItemTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <Border Background="{Binding Converter={StaticResource BackgroundConverter}}" Width="113" Height="113" Margin="6" >
                                <TextBlock Text="{Binding State}" FontFamily="{StaticResource PhoneFontFamilySemiBold}" FontSize="48" Padding="6" 
                   Foreground="{Binding Converter={StaticResource ForegroundConverter}}" VerticalAlignment="Center"/>
                            </Border>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
    
        </phone:PhoneApplicationPage.Resources>
        
        
    
        <!--LayoutRoot est la grille racine où tout le contenu de la page est placé-->
        <Grid x:Name="LayoutRoot" Background="Transparent">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
    
            <!--TitlePanel contient le nom de l'application et le titre de la page-->
            <StackPanel Grid.Row="0" Margin="12,17,0,28">
                <TextBlock Text="{Binding LocalizedResources.ApplicationTitle, Mode=OneWay, Source={StaticResource LocalizedStrings}}" Style="{StaticResource PhoneTextNormalStyle}"/>
                <TextBlock Text="{Binding LocalizedResources.ads_campaigns, Mode=OneWay, Source={StaticResource LocalizedStrings}}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}" FontSize="40"/>
            </StackPanel>
    
            <!--ContentPanel - placez tout contenu supplémentaire ici-->
            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <phone:LongListSelector x:Name="LongList" 
                                        HorizontalAlignment="Left" 
                                        Margin="0" 
                                        VerticalAlignment="Top"
                                        LayoutMode="List"
                                        IsGroupingEnabled="True"
                                        HideEmptyGroups="True"
                                        GroupHeaderTemplate="{StaticResource HeaderTemplate}"
                                        ItemTemplate="{StaticResource ItemTemplate}" 
                                        Width="446"/>
    
            </Grid>
        </Grid>


    ma classe pour trier qui est la même que le tuto windows :

    using Microsoft.Phone.Globalization;
    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Mobilair.Common
    {
        public class ListStateSort<T> : List<T>
        {
    
            public delegate string GetKeyDelegate(T item);
            public string Key { get; private set; }
    
            public ListStateSort(string key)
            {
                Key = key;
            }
    
            private static List<ListStateSort<T>> CreateGroups(SortedLocaleGrouping slg)
            {
                List<ListStateSort<T>> list = new List<ListStateSort<T>>();
    
                foreach (string key in slg.GroupDisplayNames)
                {
                    list.Add(new ListStateSort<T>(key));
                }
    
                return list;
            }
    
            public static List<ListStateSort<T>> CreateGroups(IEnumerable<T> items, CultureInfo ci, GetKeyDelegate getKey, bool sort)
            {
                SortedLocaleGrouping slg = new SortedLocaleGrouping(ci);
                List<ListStateSort<T>> list = CreateGroups(slg);
    
                foreach (T item in items)
                {
                    int index = 0;
                    if (slg.SupportsPhonetics)
                    {
                        //check if your database has yomi string for item
                        //if it does not, then do you want to generate Yomi or ask the user for this item.
                        //index = slg.GetGroupIndex(getKey(Yomiof(item)));
                    }
                    else
                    {
                        index = slg.GetGroupIndex(getKey(item));
                    }
    
                    if (index >= 0 && index < list.Count)
                    {
                        list[index].Add(item);
                    }
                }
    
                if (sort)
                {
                    foreach (ListStateSort<T> group in list)
                    {
                        group.Sort((c0, c1) => { return ci.CompareInfo.Compare(getKey(c0), getKey(c1)); });
                    }
                }
    
                return list;
            }
        }
    }
    


    et 

    List<ListStateSort<StateObj>> data = ListStateSort<StateObj>.CreateGroups(listStateObj,
                    System.Threading.Thread.CurrentThread.CurrentUICulture, (StateObj s) => { return s.State; }, true);
    
                LongList.ItemsSource = data;

    ma valeur n'est pas vide , donc je ne voit vraiment ps d'où vient le soucis.

    Avez-vous une idée ?

    Merci


    Florian R SAS

    vendredi 12 juin 2015 08:29

Réponses

  • erreur de ma part dans le headerTemplate, il fait faire un binding de "Key"

    en plus de cela je ne cherche pas à afficher la première lettre de ce qui est trié mais le mot entier, voici le code :

    var groupedList =
                    from list in listStateObj
                    group list by list.State into listByGroup
                    select new KeyedListState<string, StateObj>(listByGroup);
    
    
                LongList.ItemsSource = new List<KeyedListState<string, StateObj>>(groupedList);

    class KeyedListState<TKey, TItem> : List<TItem>
        {
    
            public TKey Key { protected set; get; }
    
            public KeyedListState(TKey key, IEnumerable<TItem> items)
            : base(items)
            {
                Key = key;
            }
    
            public KeyedListState(IGrouping<TKey, TItem> grouping)
            : base(grouping)
            {
                Key = grouping.Key;
            }
    
    
        }


    Florian R SAS

    • Marqué comme réponse Florian R SAS vendredi 12 juin 2015 13:20
    vendredi 12 juin 2015 13:20