locked
how to group items in lonlistselector if more items are added in item realized event?? RRS feed

  • Question

  • how to group items in lonlistselector if more items are added in item realized event of longlistselector ...actually i bound items on load event as this.datatext=this.  In that page Items named observablecollection of temporary city named class where  some properties  are declared....im accessing those properties to assign values to items...Actually its done for the purpose of lazy loading

    .cs file

                                                                                                                                                                                                                       

    using System;

    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using Microsoft.Phone.Controls;
    using Microsoft.Phone.Shell;
    using Microsoft.Phone.UserData;
    using NewContactToSharkApp.Classes;
    using Windows.Phone.PersonalInformation;
    using Windows.Storage.Streams;
    using Microsoft.Live;
    using System.Windows.Controls.Primitives;
    using System.Collections.ObjectModel;
    using System.Threading.Tasks;
    using System.Windows.Media;
    namespace NewContactToSharkApp
    {
        public partial class LazyLoadingDemo : PhoneApplicationPage
        {
            public ObservableCollection<City> Items { get; set; }
            public List<City> Items1 { get; set; }
            // Data loading identification
            public bool IsLoading = false;
            // Thread lock object
            private object o = new object();
            // Constructor
            public LazyLoadingDemo()
            {
                InitializeComponent();
                // A list of initial load of 100 data items
                //Items = new ObservableCollection<City>();
                //for (int i = 0; i <100; i++)
                //{
                //    Items.Add(new City { Name = "Li" + i, LastName = "Lei" + i });
                //}
                getContactStore();

            }
            public static List<StoredContact> Lst = new List<StoredContact>();

            private async void getContactStore()
            {
                ContactStore store = await ContactStore.CreateOrOpenAsync(ContactStoreSystemAccessMode.ReadWrite,
             ContactStoreApplicationAccessMode.ReadOnly);
                ContactQueryResult result = store.CreateContactQuery();
                IReadOnlyList<StoredContact> contacts = await result.GetContactsAsync();

                Items = new ObservableCollection<City>();
                Lst = contacts.OrderBy(t => t.GivenName).ToList();
                //Obj = new List<City>();
                string FName, LastName;
                try
                {
                    if (Lst.Count > 50)
                    {
                        for (int i = 0; i < 50; i++)
                        {
                            IRandomAccessStream Str = await Lst[i].GetDisplayPictureAsync();
                            IDictionary<string, object> props = await Lst[i].GetPropertiesAsync();
                            BitmapImage bitmap = new BitmapImage();
                            if (Str != null)
                                bitmap.SetSource(Str.AsStream());
                            else
                                bitmap = new BitmapImage(new Uri("Resources/Dp.png", UriKind.RelativeOrAbsolute));
                            FName = LastName = "";
                            if (props.ContainsKey(KnownContactProperties.GivenName))
                                FName = Convert.ToString(props[KnownContactProperties.GivenName]);
                            if (props.ContainsKey(KnownContactProperties.FamilyName))
                                LastName = Convert.ToString(props[KnownContactProperties.FamilyName]);
                            Items.Add(new City()
                            {
                                Name = FName,
                                Photo = bitmap,
                                BackimageUrl = new Uri("/Resources/WhiteBg.png", UriKind.RelativeOrAbsolute),
                                LastName = LastName
                            });

                        }

                    }
                    if (Lst.Count < 50)
                    {
                        for (int i = 0; i < Lst.Count; i++)
                        {
                            IRandomAccessStream Str = await Lst[i].GetDisplayPictureAsync();
                            IDictionary<string, object> props = await Lst[i].GetPropertiesAsync();
                            BitmapImage bitmap = new BitmapImage();
                            if (Str != null)
                                bitmap.SetSource(Str.AsStream());
                            else
                                bitmap = new BitmapImage(new Uri("Resources/Dp.png", UriKind.RelativeOrAbsolute));
                            FName = LastName = "";
                            if (props.ContainsKey(KnownContactProperties.GivenName))
                                FName = Convert.ToString(props[KnownContactProperties.GivenName]);
                            if (props.ContainsKey(KnownContactProperties.FamilyName))
                                LastName = Convert.ToString(props[KnownContactProperties.FamilyName]);
                            Items.Add(new City()
                            {
                                Name = FName,
                                Photo = bitmap,
                                BackimageUrl = new Uri("/Resources/WhiteBg.png", UriKind.RelativeOrAbsolute),
                                LastName = LastName
                            });

                            if (GetCityGroups(Items) == null)
                            {

                            }
                            else
                            {
                                //Items1.Add(GetCityGroups(Items).)
                            }

                            ////IRandomAccessStream Str = await Lst[i].GetDisplayPictureAsync();
                            //IDictionary<string, object> props = await Lst[i].GetPropertiesAsync();
                            ////BitmapImage bitmap = new BitmapImage();
                            ////if (Str != null)
                            ////    bitmap.SetSource(Str.AsStream());
                            ////else
                            ////    bitmap = new BitmapImage(new Uri("Resources/Dp.png", UriKind.RelativeOrAbsolute));
                            //FName = LastName = "";
                            //if (props.ContainsKey(KnownContactProperties.GivenName))
                            //{
                            //    if (!string.IsNullOrEmpty(KnownContactProperties.GivenName))
                            //        FName = Convert.ToString(props[KnownContactProperties.GivenName]);
                            //}

                            ////if (props.ContainsKey(KnownContactProperties.FamilyName))
                            ////    LastName = Convert.ToString(props[KnownContactProperties.FamilyName]);
                            //Items.Add(new City()
                            //{
                            //    Name = FName,
                            //    //Photo = bitmap,
                            //    //BackimageUrl = new Uri("/Resources/WhiteBg.png", UriKind.RelativeOrAbsolute),
                            //    //LastName = LastName
                            //});
                        }
                    }
                    var k = GetCityGroups(Items);
                    this.DataContext = this;
    //                //if (Items.Count<= 0) return;
    //                var emptyGroups = new List<Group<City>>()
    //{
    //    new Group<City>("#", new List<City>()),
    //    new Group<City>("a", new List<City>()),
    //    new Group<City>("b", new List<City>()),
    //    new Group<City>("c", new List<City>()),
    //    new Group<City>("d", new List<City>()),
    //    new Group<City>("e", new List<City>()),
    //    new Group<City>("f", new List<City>()),
    //    new Group<City>("g", new List<City>()),
    //    new Group<City>("h", new List<City>()),
    //    new Group<City>("i", new List<City>()),
    //    new Group<City>("j", new List<City>()),
    //    new Group<City>("k", new List<City>()),
    //    new Group<City>("l", new List<City>()),
    //    new Group<City>("m", new List<City>()),
    //    new Group<City>("n", new List<City>()),
    //    new Group<City>("o", new List<City>()),
    //    new Group<City>("p", new List<City>()),
    //    new Group<City>("q", new List<City>()),
    //    new Group<City>("r", new List<City>()),
    //    new Group<City>("s", new List<City>()),
    //    new Group<City>("t", new List<City>()),
    //    new Group<City>("u", new List<City>()),
    //    new Group<City>("v", new List<City>()),
    //    new Group<City>("w", new List<City>()),
    //    new Group<City>("x", new List<City>()),
    //    new Group<City>("y", new List<City>()),
    //    new Group<City>("z", new List<City>())
    //};
    //                this.lls.ItemsSource = (from t in GetCityGroups(Items).Union(emptyGroups)
    //                                        orderby t.Title
    //                                        select t).ToList();
                }
                catch (Exception Ex)
                {
                    MessageBox.Show(Ex.Message);
                }
            }
            //public string GroupHeader
            //{
            //    get
            //    {
            //        switch (Name.ToLower().Substring(0, 1))
            //        {
            //            case "a": return "a";
            //            case "b": return "b";
            //            case "c": return "c";
            //            case "d": return "d";
            //            case "e": return "e";
            //            case "f": return "f";
            //            case "g": return "g";
            //            case "h": return "h";
            //            case "i": return "i";
            //            case "j": return "j";
            //            case "k": return "k";
            //            case "l": return "l";
            //            case "m": return "m";
            //            case "n": return "n";
            //            case "o": return "o";
            //            case "p": return "p";
            //            case "q": return "q";
            //            case "r": return "r";
            //            case "s": return "s";
            //            case "t": return "t";
            //            case "u": return "u";
            //            case "v": return "v";
            //            case "w": return "w";
            //            case "x": return "x";
            //            case "y": return "y";
            //            case "z": return "z";
            //            default: return "#";
            //        }
            //    }
            //}
            private List<Group<City>> GetCityGroups(IEnumerable<City> SS)
            {
                //IEnumerable<City> cityList = GetCityList();
                return GetItemGroups(SS, c => c.Name.First().ToString());
            }
            public class Group<T> : IEnumerable<T>
            {
                public Group(string name, IEnumerable<T> items)
                {
                    this.Title = name;
                    this.Items = new List<T>(items);
                }

                //public override bool Equals(object obj)
                //{
                //    Group<T> that = obj as Group<T>;

                //    //return (that != null) &; &; (this.Title.Equals(that.Title));
                //}

                public override int GetHashCode()
                {
                    return this.Title.GetHashCode();
                }

                public string Title
                {
                    get;
                    set;
                }

                public IList<T> Items
                {
                    get;
                    set;
                }

                public bool HasItems
                {
                    get
                    {
                        return Items.Count > 0;
                    }
                }

                public Brush GroupBackgroundBrush
                {
                    get
                    {
                        if (HasItems)
                            return (SolidColorBrush)Application.Current.Resources["PhoneAccentBrush"];
                        else
                            return (SolidColorBrush)Application.Current.Resources["PhoneChromeBrush"];
                    }
                }

                #region IEnumerable<T> Members

                public IEnumerator<T> GetEnumerator()
                {
                    return this.Items.GetEnumerator();
                }

                #endregion

                #region IEnumerable Members

                System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
                {
                    return this.Items.GetEnumerator();
                }

                #endregion
            }
            private static List<Group<T>> GetItemGroups<T>(IEnumerable<T> itemList, Func<T, string> getKeyFunc)
            {
                //(from t in itemList
                // group t by t.GroupHeader into grp
                // orderby grp.Key
                // select new Group<TorrentListItemViewModel>(grp.Key, grp));

                    IEnumerable<Group<T>> groupList = from item in itemList
                                                      group item by getKeyFunc(item) into g
                                                      orderby g.Key
                                                      select new Group<T>(g.Key, g);
                    return groupList.ToList();

            }

            // The page is loaded, the subscription list of ItemRealized events
            private void PhoneApplicationPage_Loaded_1(object sender, RoutedEventArgs e)
            {
                //lls.ItemRealized += lls_ItemRealized;
            }
            // The ItemRealized event handler, judge the refresh time here
           async void lls_ItemRealized(object sender, ItemRealizationEventArgs e)
            {
                // Because the event will be multiple threads to enter, so adding thread lock, code can only be a single thread to execute control below
                if (Lst.Count < 50) return;
                lock (o)
                {
                    if (!IsLoading)
                    {
                        if (e.ItemKind == LongListSelectorItemKind.Item)
                        {
                            if ((e.Container.Content as City).Equals(lls.ItemsSource[lls.ItemsSource.Count - 1]))
                            {
                                // Set IsLoading to true, in the loading process, ban repeatedly into the
                                IsLoading = true;
                                // To show the progress of the system tray
                                Microsoft.Phone.Shell.ProgressIndicator progressIndicator = new Microsoft.Phone.Shell.ProgressIndicator();
                                Microsoft.Phone.Shell.SystemTray.ProgressIndicator = progressIndicator;
                                progressIndicator.Text = "Loading...";
                                progressIndicator.IsIndeterminate = true;
                                progressIndicator.IsVisible = true;
                                // Simulated background time-consuming tasks pull data of the scene
                                Task.Factory.StartNew(async () =>
                                {
                                    await Task.Delay(3000);
                                    // Call the UI threads add data
                                    this.Dispatcher.BeginInvoke(async() =>
                                    {
                                        int count = Items.Count;
                                        string FName, LastName;
                                        for (int i = count; i <count + 50; i++)
                                        {
                                            ////IRandomAccessStream Str = await Lst[i].GetDisplayPictureAsync();
                                            //IDictionary<string, object> props =await Lst[i].GetPropertiesAsync();
                                            ////BitmapImage bitmap = new BitmapImage();
                                            ////if (Str != null)
                                            ////    bitmap.SetSource(Str.AsStream());
                                            ////else
                                            ////    bitmap = new BitmapImage(new Uri("Resources/Dp.png", UriKind.RelativeOrAbsolute));
                                            //FName = LastName = "";
                                            //if (props.ContainsKey(KnownContactProperties.GivenName))
                                            //{
                                            //    if(!string.IsNullOrEmpty(KnownContactProperties.GivenName))
                                            //        FName = Convert.ToString(props[KnownContactProperties.GivenName]);
                                            //}

                                            ////if (props.ContainsKey(KnownContactProperties.FamilyName))
                                            ////    LastName = Convert.ToString(props[KnownContactProperties.FamilyName]);
                                            //Items.Add(new City()
                                            //{
                                            //    Name = FName,
                                            //    //Photo = bitmap,
                                            //    //BackimageUrl = new Uri("/Resources/WhiteBg.png", UriKind.RelativeOrAbsolute),
                                            //    //LastName = LastName
                                            //});
                                            IRandomAccessStream Str = await Lst[i].GetDisplayPictureAsync();
                                            IDictionary<string, object> props = await Lst[i].GetPropertiesAsync();
                                            BitmapImage bitmap = new BitmapImage();
                                            if (Str != null)
                                                bitmap.SetSource(Str.AsStream());
                                            else
                                                bitmap = new BitmapImage(new Uri("Resources/Dp.png", UriKind.RelativeOrAbsolute));
                                            FName = LastName = "";
                                            if (props.ContainsKey(KnownContactProperties.GivenName))
                                                FName = Convert.ToString(props[KnownContactProperties.GivenName]);
                                            if (props.ContainsKey(KnownContactProperties.FamilyName))
                                                LastName = Convert.ToString(props[KnownContactProperties.FamilyName]);
                                            Items.Add(new City()
                                            {
                                                Name = FName,
                                                Photo = bitmap,
                                                BackimageUrl = new Uri("/Resources/WhiteBg.png", UriKind.RelativeOrAbsolute),
                                                LastName = LastName
                                            });


                                        }
                                        // Close the progress bar
                                        progressIndicator.IsVisible = false;
                                        // Modify the state of loading
                                        IsLoading = false;
                                    });

                                });
                            }
                        }
                    }
                }


            }

           private void lls_Loaded(object sender, RoutedEventArgs e)
           {
               //if (Items.Count <= 0 || Items == null) return;
               //lls.ItemsSource = GetCityGroups(Items);
           }

           private void lls_ItemUnrealized(object sender, ItemRealizationEventArgs e)
           {

           }

           private void lls_ManipulationCompleted(object sender, System.Windows.Input.ManipulationCompletedEventArgs e)
           {

           }

           private void lls_Unloaded(object sender, RoutedEventArgs e)
           {

           }

           private void lls_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
           {
               //lls.ItemsSource = GetCityGroups(Items);
           }
        }
    }

    .xaml file

    <phone:PhoneApplicationPage
        x:Class="NewContactToSharkApp.LazyLoadingDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait" Orientation="Portrait"
        mc:Ignorable="d"
        shell:SystemTray.IsVisible="True" Loaded="PhoneApplicationPage_Loaded_1">

        <!--LayoutRoot is the root grid where all page content is placed-->
        <phone:PhoneApplicationPage.Resources>
            <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 BorderThickness="4" >
                                <TextBlock FontFamily="\Fonts\HelveticaNeueLTPro-LtEx.otf" Text="{Binding Title}" TextAlignment="Center"
                                                   FontSize="48" Padding="6"
                                                   Foreground="White"
                                                   VerticalAlignment="Center" />
                                <Border.Background>

                                    <ImageBrush ImageSource="/Resources/Block1.png" AlignmentX="Center" AlignmentY="Center" />



                                </Border.Background>
                            </Border>
                        </DataTemplate>
                    </Setter.Value>

                </Setter>

            </Style>
            <DataTemplate x:Key="groupHeaderTemplate">
                <Border Width="55" Height="55" HorizontalAlignment="Left"  Margin="6">

                    <TextBlock Text="{Binding Title}" FontFamily="\Fonts\HelveticaNeueLTPro-LtEx.otf"
                       FontSize="40" Padding="6"
                       VerticalAlignment="Center" Foreground="White"   HorizontalAlignment="Center"/>

                    <Border.Background>
                        <ImageBrush ImageSource="/Resources/Block1.png">

                        </ImageBrush>
                    </Border.Background>
                </Border>
            </DataTemplate>
            <DataTemplate x:Key="citiesItemTemplate">
                <Border BorderThickness="1" >
                    <StackPanel Orientation="Horizontal">

                        <Image Source="{Binding Photo}"  Height="56" Width="56" Margin="6,0,10,0" Stretch="Fill">
                            <Image.Clip>
                                <EllipseGeometry Center="28,28" RadiusX="28" RadiusY="28"></EllipseGeometry>
                            </Image.Clip>
                        </Image>
                        <StackPanel>

                            <!--<TextBlock Text="{Binding Name, StringFormat='City: {0}'}" FontSize="26" />-->
                            <TextBlock FontSize="26" FontFamily="\Fonts\HelveticaNeueLTPro-ThEx.otf"  HorizontalAlignment="Center" VerticalAlignment="Center" Margin="15">
                                <Run Text="{Binding Name,Mode=OneWay}"/>
                                <Run Text=" "/>
                                <Run Text="{Binding LastName,Mode=OneWay}"/>
                            </TextBlock>
                            <!--<TextBlock Text="{Binding Language, StringFormat='Language: {0}'}" Style="{StaticResource PhoneTextSubtleStyle}"  />-->

                            <TextBlock Text="{Binding PhoneNo}" FontFamily="\Fonts\HelveticaNeueLTPro-ThEx.otf" Visibility="Collapsed" FontSize="25" HorizontalAlignment="Center" VerticalAlignment="Center" />
                            <TextBlock Text="{Binding Email}" FontFamily="\Fonts\HelveticaNeueLTPro-ThEx.otf" Visibility="Collapsed" FontSize="25" HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </StackPanel>
                        <StackPanel.Background>
                            <ImageBrush ImageSource="{Binding BackimageUrl}" Stretch="Fill"></ImageBrush>
                        </StackPanel.Background>
                    </StackPanel>
                </Border>
            </DataTemplate>
            <!--<DataTemplate x:Key="citiesListHeader">
                <Border Background="White" Opacity="0.2" Height="70">
                    <TextBlock Text="Cities Header" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black" />
                </Border>
            </DataTemplate>

            <DataTemplate x:Key="citiesListFooter">
                <Border Background="White" Opacity="0.2" Height="70">
                    <TextBlock Text="Cities Footer" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black"/>
                </Border>
            </DataTemplate>-->

        </phone:PhoneApplicationPage.Resources>

        <Grid>

            <phone:LongListSelector  LayoutMode="List" ItemsSource="{Binding Items}" x:Name="lls"   ItemTemplate="{StaticResource citiesItemTemplate}"   Loaded="lls_Loaded" ItemUnrealized="lls_ItemUnrealized" Unloaded="lls_Unloaded"    GroupHeaderTemplate="{StaticResource groupHeaderTemplate}"
       IsGroupingEnabled="True"  JumpListStyle="{StaticResource LongListSelectorJumpListStyle}" PropertyChanged="lls_PropertyChanged">
                <!--<phone:LongListSelector.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Name}" FontSize="30"></TextBlock>
                            --><!--<TextBlock Text="{Binding LastName}" FontSize="30" Margin="30,0,0,0"></TextBlock>--><!--
                        </StackPanel>
                    </DataTemplate>
                </phone:LongListSelector.ItemTemplate>-->
            </phone:LongListSelector>
            <Grid.Background>

                <ImageBrush ImageSource="/Resources/Bg.png"></ImageBrush>
            </Grid.Background>
        </Grid>

    </phone:PhoneApplicationPage>

    Thursday, July 30, 2015 11:26 AM