2011-10-22 100 views
0

我有一個表(Hesab)白3字段(ID,Name,FatherID),並使用EF。如何從DataBase填充TreeView

ID fatherID名稱

1 NULL甲

2 NULL乙

3 2 C

4 1 d

5 4 E

6 4 F

7的3G

8 1小時

,我想填寫該表格在樹視圖

樹必須填寫這樣 甲 -D --F --e - ħ 乙 -C --g

我創建此類

class Hesabs:Hesab 
    { 
    public Hesabs() 
    { 
     AllHesab = new ObservableCollection<Hesab>(); 
    } 
    public ObservableCollection<Hesab> AllHesab { get; set; } 
      } 

和視圖模型

 public ObservableCollection<Hesabs> AllHesab { get; set; } 
    public ObservableCollection<Hesabs> FirstHesab { get; set; } 

    public ViewModelHesabs() 
    { 
     CRMEntities crm=new CRMEntities(); 

     var ls = from h in crm.Hesab 
       where (h.FatherID == null) 
       select h; 
     ObservableCollection<Hesabs> hes = new ObservableCollection<Hesabs>(); 
     foreach (Hesab hh in ls.ToList()) 
     { 
      var ls2 = from h in crm.Hesab 
         where (h.FatherID == hh.ID) 
         select h; 
      Hesabs hesab = new Hesabs(); 
      hesab.Name = hh.Name; 
      hesab.ID = hh.ID; 
      hesab.AllHesab = new ObservableCollection<Hesab>(ls2.ToList()); 
      hes.Add(hesab); 
     } 
     FirstHesab = hes; 
    } 

和XAML

 <TreeView ItemsSource="{Binding FirstHesab}"> 
     <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding AllHesab}" DataType="   {x:Type local:Hesabs}"> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding Name}" Tag="{Binding ID}"/> 
       </StackPanel> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

但填2級:(

回答

1

你只檢查與FatherId == null元素並賦予他們的孩子 - 這就是爲什麼只有你在樹中獲得一級層次結構。變化:

foreach (Hesab hh in ls.ToList()) 

到:

foreach (Hesab hh in crm.Hesab.ToList()) 
{ 
    // ... 
    // also assign father id, you'll need it to extract actual root elements 
    hesab.FatherId = hh.FatherId; 
} 

獲得root元素,簡單地詢問hes.Where(h => h.FatherId == null)並將其賦值給FirstHesab

在一個側面說明,你對你的視圖模型可以更好,而不是Hesabs類的,你可以有:

class HesabViewModel 
{ 
    HesabViewModel(Hesab hesab) 
    { 
     // set properties you'd like to expose to View, eg: 
     this.Name = hesab.Name; 
     this.Children = new ObservableCollection<HesabViewModel>(); 
    } 

    public string Name { get; set; } 
    public ObservableCollection<HesabViewModel> Children { get; private set; } 
} 

基本上,你的視圖模型類應該可以更輕鬆地爲你的意見模型對象。繼承(就像你現在這樣做)可能不是最好的方式 - 它並不真正將模型和視圖分開。

+0

非常感謝... – 2011-10-22 10:02:54