Question

WinPhone 8 project in C#. I'm trying to populate a grouped list. The group headers appear, the items don't. The relevant code is:

class MyPage
{
    public class Group : IGrouping<string, string>
    {
        public string Title{get;set;}
        public string[] Items;

        public string Key
        {
            get { return Title; }
        }

        public IEnumerator<string> GetEnumerator()
        {
            return (Items as IEnumerable<string>).GetEnumerator();
        }

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

    private Group[] m_ItemGroups =
        {
            new Group(){Title = "A", Items = new string[] {"A", "ASA"}},
            new Group(){Title = "X", Items = new string[] {"X", "XX"}},
        };

    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        TheList.ItemsSource = m_ItemGroups;
    }
}

And the XAML:

<phone:LongListSelector
        x:Name="TheList"
        Grid.Row="1"
        IsGroupingEnabled="True"
        SelectionChanged="OnSelChanged"
        >

        <phone:LongListSelector.GroupHeaderTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Title}"
                   Style="{StaticResource PhoneTextGroupHeaderStyle}"
                   Foreground="{StaticResource PhoneForegroundBrush}" />
            </DataTemplate>
        </phone:LongListSelector.GroupHeaderTemplate>

        <phone:LongListSelector.ItemTemplate>
            <DataTemplate>
                <StackPanel Margin="0,0,0,17" Width="432" Orientation="Horizontal">
                    <TextBlock Text="Hello world" TextWrapping="Wrap" Width="345"/>
                </StackPanel>

            </DataTemplate>
        </phone:LongListSelector.ItemTemplate>

    </phone:LongListSelector>

Neither of the GetEnumerator() methods is called. The Key getter is never called, either. Looks like the list does not recognize my Group class as a collection of strings that it is. Please, what's wrong here?

The item template is fine. When I change the list to non-grouped, I see two items with dummy text.

Replacing the string as the item type with a custom class does not help.

Was it helpful?

Solution 2

Looks like LongListSelector expects, in grouped mode, that the objects in the ItemsSource collection implement System.Collections.IList (untyped). A simple IEnumerator won't do.

I wish that was documented. So far, WP8 SDK docs suck big time.

OTHER TIPS

Seva is correct, Microsoft changed the type requirement for what you assign to the ItemsSource of a LongListSelector in the Grouped mode.

You need to convert whatever class you are using to group your items from inheriting IEnumerable<T> to just inheriting List<T>.

See here for full description of answer

It's pretty simple actually, this is what an example of a Group class you could use with the WP8 LongListSelector would look like:

    public class Group<T> : List<T>
{
    public Group(char name, IEnumerable<T> items) : base(items)
    {
        this.Letter = name;

    }



    public char Letter
    {
        get;
        set;
    }


}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top