我创建了一个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”),列表也会显示在底部。我不知道为什么会这样:/
非常感谢你能提供帮助!
答案 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;
将此模型用于数据似乎允许选择器正常运行,但是作业知道为什么它不适用于第一种方法......