LongListSelector GroupItemsPanel选择不起作用

时间:2013-08-01 11:13:47

标签: windows-phone-7 longlistselector

我创建了一个LongListSelector,它在运行时填充下载到手机的数据。这些组都是正确的,GroupItemsPanel看起来也是正确的。我的问题是每当我从GroupItemsPanel中选择时,列表就会滚动到底部而不是我选择的组头。

这是我的XAML代码

<toolkit:LongListSelector ItemsSource="{Binding Institutions}"
                          GroupHeaderTemplate="{StaticResource GroupHeader}"
                          GroupItemTemplate="{StaticResource GroupItem}"
                          ItemTemplate="{StaticResource ItemTmpl}"
                          Grid.Row="1">
    <toolkit:LongListSelector.GroupItemsPanel>
            <ItemsPanelTemplate>
                <toolkit:WrapPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </toolkit:LongListSelector.GroupItemsPanel>
</toolkit:LongListSelector>

<DataTemplate x:Key="GroupHeader">
    <Border Background="{StaticResource OrangeHighlight}" 
            Margin="{StaticResource PhoneTouchTargetOverhang}" 
            Padding="{StaticResource PhoneTouchTargetOverhang}">
        <TextBlock Text="{Binding Key}"/>
    </Border>
</DataTemplate>

<DataTemplate x:Key="GroupItem">
    <Border Background="{StaticResource OrangeHighlight}" 
            Margin="{StaticResource PhoneTouchTargetOverhang}" 
            Padding="{StaticResource PhoneTouchTargetOverhang}">
        <TextBlock Text="{Binding Key}" 
                   Style="{StaticResource PhoneTextLargeStyle}"/>
    </Border>
</DataTemplate>

<DataTemplate x:Key="ItemTmpl">
    <Grid>
        <CheckBox Content="{Binding Name}"
                  Style="{StaticResource CheckBoxStyle}"/>
    </Grid>
</DataTemplate>

这就是我创建ItemsSource的方法。数据按Name字段的第一个字符分组。

public IEnumerable<GroupingLayer<string, Field>> Institutions
{
    get
    {
        if (m_oInstitutions == null)
            m_oInstitutions = new List<Field>();
        //
        var oGrouping = from oField in m_oInstitutions 
                        group oField by oField.Name[0].ToString().ToUpper() 
                        into oGroup select new GroupingLayer<string, Field>(oGroup);
        return oGrouping;
    }
}

public class Field
{
    public string ID { get; set; }
    public string Name { get; set; }
}

public class GroupingLayer<TKey, TElement> : IGrouping<TKey, TElement>
{
    private readonly IGrouping<TKey, TElement> m_oGrouping;

    public GroupingLayer(IGrouping<TKey, TElement> oUnit)
    {
        m_oGrouping = oUnit;
    }

    public TKey Key { get { return m_oGrouping.Key; } }

    public IEnumerator<TElement> GetEnumerator()
    {
        return m_oGrouping.GetEnumerator();
    }

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

无论我从GroupItemsPanel中选择哪个项目,列表都会滚动到底部。即使我选择了第一个项目(通常是“A”),列表也会显示在底部。我不知道为什么会这样:/

非常感谢你能提供帮助!

1 个答案:

答案 0 :(得分:0)

我仍然无法解释为什么会出现这个特殊问题,但我找到了一种让选择正常工作的方法。

我没有使用GroupingLayer类,而是使用List<>的摘要。

public class KeyGroup<T> : List<T>
{
    public string Key { get; set; }
}

这意味着ItemsSource就是这样创建的(来自普通List<>):

List<Field> oFields;
List<KeyGroup<Field>> oGroups;
String sKey;
Bool bFound;
//
oFields = GetLiveData();
oGroups = new List<KeyGroup<Field>>();
//
foreach (var oField in oFields)
{
    sKey = oField.Name[0].ToString().ToUpper();
    bFound = false;
    //
    // Loop backwards through the groups if the fields are sorted
    for (int i = oGroups.Count - 1; i >= 0; i--)
        if (oGroups[i].Key.Equals(sKey))
        {
            oGroups[i].Add(oField);
            bFound = true;
            break;
        }
    //
    if (!bFound)
    {
        oGroups.Add(new KeyGroup<Field>() { Key = sKey });
        oGroups[oGroups.Count - 1].Add(oField);
    }
}
//
// Set the ItemsSource to oGroups
myLongListSelector.ItemsSource = oGroups;

将此模型用于数据似乎允许选择器正常运行,但是作业知道为什么它不适用于第一种方法......