2010-11-17 3 views
2

Я хочу, чтобы привязка к ListBox к связанному спискуWPF привязка к связанному списку

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

Я хочу использовать экземпляр MyClass как источник данных о наличии ListBox, в основном показать список экземпляра MyClass и все это предыдущие.

Конечно, привязка к экземпляру MyClass приведет к показу только самого верхнего родителя. Какой был бы лучший подход для этого?

ответ

4

Зачем вам нужна индивидуальная реализация LinkedList в первую очередь? Существует реализация .NET уже: System.Collections.Generic.LinkedList

Кроме этого, у вас есть в основном три варианта:

  1. Рекомендуется: Если это соответствует вашим бизнес-логики, по крайней мере, impement IEnumerable в MyClass (например, списки .NET)
  2. Создать ViewModel, который пересекает ваши пункты MyClass и помещает их в ObservableCollection
  3. Создание IValueConverter О.Б. ект для преобразовать связанный список в collectionType как ObservableCollection
+0

Упс я пропустил Generic LinkedList, что это именно то, что мне нужно, спасибо , – eriksmith200

0

Вы можете использовать BCL LinkedList<T> класс. Или же, если вам нравится ваш класс очень много можно реализовать IEnumerable как этот

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

На самом деле, реализующего IEnumerable будет достаточно:

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

И да, с помощью LinkedList<T> может быть проще и более адекватной для ваших целей.

0

Проще всего (на мой взгляд) является реализация 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(); 
    } 
} 

Затем код будет выглядеть следующим образом

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 
    }