2010-11-17 5 views
2

Je veux DataBind un ListBox à une liste liéeWPF databinding à une liste liée

public class MyClass 
{ 
    public string MyText{ get; set; } 
    public MyClass PreviousItem{ get; set; } 
} 

Je veux utiliser une instance de MyClass comme source de données d'un ListBox, pour montrer essentiellement une liste de l'instance MyClass et tout c'est PreviousItems.

Bien sûr, la liaison à une instance de MyClass entraînera uniquement l'affichage du parent le plus élevé. Quelle serait la meilleure approche pour cela?

Répondre

4

Pourquoi avez-vous besoin d'une implémentation personnalisée d'une LinkedList en premier lieu? Il y a une implémentation .NET déjà: System.Collections.Generic.LinkedList

Autre que cela, vous avez essentiellement trois options:

  1. Recommandé: Si elle correspond à votre logique métier, impement au moins IEnumerable dans MyClass (comme les listes .NET)
  2. Créer un ViewModel qui traverse vos objets de MyClass et les met dans un ObservableCollection
  3. Créer un ob IValueConverter Ject à convertir votre liste liée à une CollectionType comme ObservableCollection
+0

Whoops J'ai raté le générique LinkedList, qui est exactement ce que je dois, merci . – eriksmith200

0

Vous pouvez utiliser la classe BCL LinkedList<T>. Ou bien si vous aimez votre classe très bien vous pouvez mettre en œuvre IEnumerable comme celui-ci

public class MyClass : IEnumerable<MyClass> 
    { 
     public string MyText { get; set; } 
     public MyClass PreviousItem { get; set; } 

     public IEnumerator<MyClass> GetEnumerator() 
     { 
      var item = this; 
      do 
      { 
       yield return item; 
       item = item.PreviousItem; 
      } while (item != null); 

     } 

     IEnumerator IEnumerable.GetEnumerator() 
     { 
      return GetEnumerator(); 
     } 
    } 
0

En fait, la mise en œuvre IEnumerable suffirait:

public IEnumerable<MyClass> TraverseItemsFromCurrent 
    { 
     get 
     { 
      var current = this; 
      yield return current; 
      while (current.PreviousItem != null) 
      { 
       current = current.PreviousItem; 
       yield return current; 
      } 
     } 
    } 

Et oui, en utilisant LinkedList<T> pourrait être plus facile et plus adéquate à vos besoins.

0

La chose la plus facile (à mon avis) est de mettre en œuvre IEnumerable

public class MyClass : IEnumerable<MyClass> 
{ 
    public string MyText { get; set; } 
    public MyClass PreviousItem { get; set; } 

    IEnumerator<MyClass> IEnumerable<MyClass>.GetEnumerator() 
    { 
     for (var item = this; item.PreviousItem != null; item = item.PreviousItem) 
      yield return item; 
    } 

    public IEnumerator GetEnumerator() 
    { 
     return ((IEnumerable<MyClass>)this).GetEnumerator(); 
    } 
} 

Ensuite, votre code ressemblera à ceci

public Window1() 
    { 
     MyClass item1 = new MyClass() {MyText = "No1"}; 
     MyClass item2 = new MyClass() {MyText = "No2"}; 
     MyClass item3 = new MyClass() {MyText = "No3"}; 
     MyClass item4 = new MyClass() {MyText = "No4"}; 

     item4.PreviousItem = item3; 
     item3.PreviousItem = item2; 
     item2.PreviousItem = item1; 

     DataContext = item4; // your first item 
    }