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

  • Question

  •  CS File:

        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);
                }
            }

                                   

       private List<Group<City>> GetCityGroups(IEnumerable<City> SS)
            {
                //IEnumerable<City> cityList = GetCityList();
                return GetItemGroups(SS, c => c.Name.First().ToString());
            }

            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();

            }

       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;
                                    });

                                });
                            }
                        }
                    }
                }
              
                
            }

    .xaml file

     <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>

    Thursday, July 30, 2015 11:32 AM