2013-08-01 1 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 списка прокручивают на дно. Даже если я выбираю первый элемент (обычно «А»), список идет в нижнюю часть. Я не знаю, почему это происходит:/

Большое спасибо, если вы можете помочь!

ответ

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; 

Используя эту модель для данных, кажется, позволяет селектор, чтобы нормально функционировать, но работа знает, почему это Бесполезное не работает с первым подходом ...