2011-10-22 105 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