2013-08-01 59 views
0

我創建了一個LongListSelector,它在運行時填充下載到手機中的數據。這些組都在那裏並且正確,GroupItemsPanel看起來也是正確的。我的問題是,每當我從GroupItemsPanel中選擇時,列表將滾動到底部,而不是滾動到我選擇的組標題。LongListSelector 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

我仍然無法解釋爲什麼會出現這個特殊問題,但我找到了一種方法讓選擇正常工作。

而不是使用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; 

利用該模型對數據似乎允許選擇正常工作,但喬布斯知道爲什麼它沒不用第一種方法...