2010-11-17 98 views
2

我想數據綁定列表框的鏈表WPF數據綁定到一個鏈表

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

我想用MyClass的實例爲ListBox的數據源,基本上顯示MyClass的實例的列表並且它是所有的PreviousItems。

當然綁定到MyClass的一個實例將導致只顯示最上面的父對象。對此最好的方法是什麼?

回答

4

爲什麼首先需要一個LinkedList的自定義實現?有一個.NET實現不已:System.Collections.Generic.LinkedList

除此之外,您有三個基本選項:

  1. 推薦:如果它適合你的 業務邏輯,impement至少 的IEnumerable在MyClass的(如.NET名單)
  2. 創建一個視圖模型遍歷 你的MyClass項目和 將它們放入一個 的ObservableCollection
  3. 創建的IValueConverter OB JECT到 你的鏈接列表轉換爲 collectionType像 的ObservableCollection
+0

哎呦我錯過了通用的LinkedList,這正是我需要的,謝謝。 – eriksmith200 2010-11-17 17:09:45

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 
    }