Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何从数据库中填充TreeView_Wpf - Fatal编程技术网

Wpf 如何从数据库中填充TreeView

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

我有一个包含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 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; }
}