Wpf 如何从数据库中填充TreeView
我有一个包含3个字段(ID、Name、FatherID)的表(Hesab),并使用EF 身份证父亲身份证姓名 1空A 2空B 3.2 C 41D 5.4 E 6.4楼 7.3克 8小时1小时 我想用treeview来填这张表 这棵树一定是这样长的 A. -D --F --E -H B -C --G 我创建了这个类Wpf 如何从数据库中填充TreeView,wpf,Wpf,我有一个包含3个字段(ID、Name、FatherID)的表(Hesab),并使用EF 身份证父亲身份证姓名 1空A 2空B 3.2 C 41D 5.4 E 6.4楼 7.3克 8小时1小时 我想用treeview来填这张表 这棵树一定是这样长的 A. -D --F --E -H B -C --G 我创建了这个类 class Hesabs:Hesab { public Hesabs() { AllHesab = new ObservableColle
class Hesabs:Hesab
{
public Hesabs()
{
AllHesab = new ObservableCollection<Hesab>();
}
public ObservableCollection<Hesab> AllHesab { get; set; }
}
class-Hesab:Hesab
{
公共卫生服务
{
AllHesab=新的可观测集合();
}
公共可观测集合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;
}
public observeCollection AllHesab{get;set;}
公共ObservableCollection FirstHesab{get;set;}
公共视图模型hesabs()
{
CRMEntities crm=新的CRMEntities();
var ls=从crm.Hesab中的h开始
其中(h.FatherID==null)
选择h;
ObservableCollection hes=新的ObservableCollection();
foreach(ls.ToList()中的Hesab hh)
{
var ls2=从crm.Hesab中的h开始
其中(h.FatherID==hh.ID)
选择h;
hesab hesab=新的hesab();
hesab.Name=hh.Name;
hesab.ID=hh.ID;
hesab.AllHesab=新的可观察集合(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级:(您只检查父ID==null的元素并分配其子元素-这就是为什么您在树中只获得一级层次结构。更改:
foreach (Hesab hh in ls.ToList())
致:
要获取根元素,只需查询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; }
}
类HesabViewModel
{
Hesab视图模型(Hesab-Hesab)
{
//设置要公开查看的属性,例如:
this.Name=hesab.Name;
this.Children=新的可观察集合();
}
公共字符串名称{get;set;}
公共可观测集合子项{get;private set;}
}
基本上,您的视图模型类应该为您的视图提供对模型对象的更容易访问。继承(就像您现在所做的那样)可能不是最好的方法-它并没有真正将模型与视图分开
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; }
}