分组长列表选择器:标题出现,项目不出现

3

我正在使用C#开发WinPhone 8项目。我尝试填充一个分组列表。组标题出现了,但是项目没有出现。相关代码如下:

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

以下是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>

没有调用任何一个GetEnumerator()方法。也没有调用Key的getter方法。看起来列表没有将我的Group类识别为字符串集合。请问这里出了什么问题?
项目模板没问题。当我将列表更改为非分组时,我可以看到两个带有虚拟文本的项目。
string作为项目类型替换为自定义类也无济于事。
2个回答

5

Seva是正确的,Microsoft已经改变了在分组模式下为LongListSelectorItemsSource分配的类型要求。

您需要将用于对项目进行分组的任何类从继承IEnumerable<T>转换为仅继承List<T>

请参见此处获取完整答案描述

实际上很简单,以下是您可以与WP8 LongListSelector一起使用的Group类的示例:

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

    }



    public char Letter
    {
        get;
        set;
    }


}

1

看起来LongListSelector在分组模式下,期望ItemsSource集合中的对象实现System.Collections.IList(未类型化)。简单的IEnumerator是不行的。

我希望这个被记录下来。到目前为止,WP8 SDK文档真的很糟糕。


我现在也遇到了同样的问题。你能否发布一下你IList的实现呢? - Markus Rudel
最终我使用了一个ObservableCollection的ObservableCollection。没有手动实现IList。 - Seva Alekseyev
@SevaAlekseyev 我遇到了同样的问题,您能帮我解决吗?http://stackoverflow.com/questions/21986760/binding-data-in-longlistselector - user2056563

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接