2010-12-09 8 views
2

J'ai étendu un ListCollectionView et overridded GetItemAt comme ceci:Obtenez élément interne pas de ListCollectionView

public class LazyLoadListCollectionView : ListCollectionView 
{ 

    public override object GetItemAt(int index) 
    { 
    object rc = base.GetItemAt(index); 
    // do something 
    return rc; 
    } 
} 

Maintenant pour mon « faire quelque chose » je besoin de la position de l'élément dans la liste interne. Tant que ListCollectionView n'est pas trié, "index" de ListCollectionView sera le même pour la collection interne, mais dès que ListCollectionView est utilisé, index correspond à l'index de la collection interne (la collection interne étant ObservableCollection).

Alors, où ListCollectionView obtient-il l'index des collections internes de l'index dans ListCollectionView? Ne devrait-il pas y avoir un "int ConvertToInternalIndex (int index)" quelque part?

+0

. Qu'essayez-vous de faire? Je pense, vous devez d'abord explorer [ListCollectionView] (http://msdn.microsoft.com/en-us/library/system.windows.data.listcollectionview_properties.aspx) d'abord, car il est capable de s'adapter à la plupart des scénarios que les programmeurs veulent habituellement mettre en œuvre dans leur application. – Nawaz

Répondre

0

Je suppose que c'est parce que SourceCollection pour ListCollectionView est de type IEnumerable. Pour obtenir l'index dans SourceCollection, vous pouvez essayer de le convertir en IList et utiliser IndexOf. Pour obtenir l'index de IEnumerable, voir this question

public override object GetItemAt(int index) 
{ 
    object rc = base.GetItemAt(index); 
    // do something 

    int internalIndex = -1; 
    IList sourceCollection = SourceCollection as IList; 
    if (sourceCollection != null) 
    { 
     internalIndex = sourceCollection.IndexOf(rc); 
    } 
    else 
    { 
     // See 
     // https://stackoverflow.com/questions/2718139 
    } 
    return rc; 
} 
+0

Comme je l'ai écrit dans ma question, la collection source est une ObservableCollection, donc implémente IList. – Sam

+0

Cela ressemble un peu à un hack, mais bon, ça marche, merci! – Sam

+1

@Sam: Oui, j'ai vu ça :) Je pensais juste si vous vouliez une solution plus générique. –