2010-09-01 3 views
0

J'ai une liste d'éléments que je place dans une ObservableCollection, que je relie ensuite à une interface utilisateur de DataGrid créée en XAML. L'une des colonnes affichées est l'index de l'élément dans la liste. Actuellement, je crée une propriété et je la lie. Cependant, cela crée beaucoup de travail lorsque j'ai besoin de mettre à jour/ajouter/supprimer des éléments de la liste - je dois passer en revue tous les éléments affectés et changer leur propriété. Ma question est: Y at-il un moyen d'afficher automatiquement l'index d'un élément de la collection dans l'interface utilisateur?ObservableCollection auto-index

+0

[Voir cette question] (http://stackoverflow.com/questions/3451422/wpf-bind- to-item-index-from-itemtemplate-of-itemscontrol /) –

+0

Cela fonctionne. Vous devez vous lier à DataGridRow AlternationIndex. – mdm20

+0

Cela ressemble exactement à ce dont j'ai besoin. Cependant, le contrôle spécifique que j'utilise est un RadTreeListView et je n'arrive pas à obtenir l'AlternationIndex. Des idées? – jaws

Répondre

2

Vous pouvez utiliser un convertisseur pour votre liaison où votre convertisseur effectuerait une recherche pour trouver l'index. Ensuite, peu importe où se trouve votre article dans la collection, vous auriez l'index correct.

+0

J'ai donc implémenté ceci, mais le convertisseur n'est pas appelé automatiquement lorsqu'un élément est ajouté/retiré de la liste. Ainsi, par exemple, lorsque je supprime un élément, tous les éléments situés en dessous conservent leur ancienne valeur d'index. – jaws

+0

sonne comme ne pas mettre à jour sur l'événement changé de collection, sonne comme si vous avez besoin d'attacher un gestionnaire et, à l'intérieur, forcer une mise à jour. –

1

Avez-vous envisagé de mettre en place un viewmodel par-dessus? Ensuite, vous pouvez afficher votre ObservableCollection mais vous voulez et mettre en œuvre sous les couvertures

public class IndexedObject 
{ 

    private object _rootObject; 
    private int _index; 

    public IndexedObject(object rootObject, int index) 
    { 
     _rootObject = rootObject; 
     _index=index; 
    } 

    public string Value 
    { 
     get 
     { 
      return _rootObject.ToString(); 
     } 
    } 

    public int Index 
    { 
     get 
     { 
      return _index; 
     } 
    } 
} 

Ensuite, vous pouvez mettre en œuvre cette propriété sur la cette classe ou la classe affiche votre ObservableCollection

ObservableCollection<object> _yourCollection; 

    public IEnumerable<IndexedObject> IndexedObjects 
    { 

     get 
     { 
      for (int i = 0; i < _yourCollection.Count; i++) 
      { 
       yield return new IndexedObject(_yourCollection[i], i); 
      } 
     } 
    } 

alors vous feriez L'événement ObservableCollection collectionchanged informe le programme que votre propriété IndexedObjects a été modifiée. Ensuite, vous pouvez simplement lier à la propriété IndexedObjects et utiliser la propriété Index indépendamment de ce à quoi ressemble la collection réelle sous-jacente :)