C# 在每个节点中使用不同的子对象创建TreeView,完全尊重WPF MVVM

C# 在每个节点中使用不同的子对象创建TreeView,完全尊重WPF MVVM,c#,wpf,xaml,mvvm,treeview,C#,Wpf,Xaml,Mvvm,Treeview,我想完全尊重Wpf MVVM,创建如下treeView: <!-- Level 1 --> <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}"> <Label Content="{Binding ChildLevel1Name}"/> </Hiera

我想完全尊重Wpf MVVM,创建如下treeView:

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
根//级别0

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
B1-儿童1//1级

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
B1-1-儿童1-1//2级

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
B1-2-儿童1-2

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
B1-3-

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
B2-儿童2//1级

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
B2-1儿童2-1//2级

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
B2-2儿童2-2

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
B2-3

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
正如你所看到的,我有三级树视图

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
级别0:根目录(始终修复)

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
级别1:两个子(也总是固定)

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
级别2:动态子级,它们是从两个不同的类创建的

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
所以我的问题是如何在级别2中为级别1中的每个节点创建不同的子节点

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
我使用了下面的代码,但在1级中,我的父母都是相同的孩子

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
我已经在这个网站上以及在网络上看到了许多建议的解决方案。。。但就是不知道怎么做

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
我的尝试:

  public class MyViewModel 
{
    //private ReadOnlyCollection<AttributesMapDocViewModel> _attributeMapDoc;

    public object _document;

    #region Methodes




    private List<Level0ViewModel> _myDoc;

    public List<Level0ViewModel> MyDoc
    {
        get { return _myDoc; }
        set
        {
            _myDoc = value;
        }
    }

    #endregion

    #region Constructeur

    public MyViewModel()
    {


        MyDoc = new List<Level0ViewModel>()
        {
            new Level0ViewModel("Root",_document), //_document conatins data from xml file (code not shown)
        };
    }


    #endregion

}

public class Level0ViewModel : ViewModelBase
{
    private List<Level1ViewModel> _childLevel1;

    public Level0ViewModel(string name, object myObj)
    {
        ChildLeve0Name = name;
        ChildLevel1 = new List<Level1ViewModel>()
        {
            new Level1ViewModel("Child1",myObj),
            new Level1ViewModel("Child2",myObj)
        };
    }

    public List<Level1ViewModel> ChildLevel1
    {
        get
        {
            return _childLevel1;
        }
        set
        {
            SetProperty(ref _childLevel1, value, () => ChildLevel1);

        }
    }

    public string ChildLeve0Name { get; set; }
}

public class Level1ViewModel : ViewModelBase
{
    private ObservableCollection<Level2SecondTypeViewModel> _childLevel2SecondType;
    public ObservableCollection<Level2SecondTypeViewModel> ChildLevel2SecondType
    {
        get { return _childLevel2SecondType; }
        set
        {
            if (_childLevel2SecondType != value)
            {
                SetProperty(ref _childLevel2SecondType, value, () => ChildLevel2SecondType);

            }
        }
    }


    private ObservableCollection<Level2FirstTypeViewModel> _childLevel2FirstType;
    public ObservableCollection<Level2FirstTypeViewModel> ChildLevel2FirstType
    {
        get { return _childLevel2FirstType; }
        set
        {
            if (_childLevel2FirstType != value)
            {
                SetProperty(ref _childLevel2FirstType, value, () => ChildLevel2FirstType);

            }
        }
    }

    public Level1ViewModel(string name, object mapAtt)
    {
        ChildLevel1Name = name;

        ChildLevel2FirstType = new ObservableCollection<Level2FirstTypeViewModel>();
        foreach (FirstType myFirstType in mapAtt.FirstTypes)
        {
            ChildLevel2FirstType.Add(new Level2FirstTypeViewModel(myFirstType));
        }

        ChildLevel2SecondType = new ObservableCollection<Level2SecondTypeViewModel>();
        foreach (SecondType mySecondType in mapAtt.SecondTypes)
        {
            ChildLevel2SecondType.Add(new Level2SecondTypeViewModel(mySecondType));
        }

    }

    public string ChildLevel1Name
    {
        get;
        set;
    }
}

public class Level2FirstTypeViewModel : ViewModelBase
{
    public Level2FirstTypeViewModel(FirstType fType)
    {
        FirstTypeName = fType.name;
    }

    public string FirstTypeName
    {
        get;
        set;
    }
}


public class Level2SecondTypeViewModel
{
    public Level2SecondTypeViewModel(SecondType sType)
    {
        SecondTypeName = sType.name;
    }

    public string SecondTypeName
    {
        get;
        set;
    }

}




 <TreeView ItemsSource="{Binding MyDoc}" >
  <TreeView.Resources>
            <HierarchicalDataTemplate ItemsSource="{Binding MapAttDef}" DataType="{x:Type local:Level0ViewModel}">
                      <Label Content="{Binding ChildLeve0Name}"/>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate ItemsSource="{Binding ChildLevel2SecondType}" DataType="{x:Type local:Level1ViewModel}">
                      <Label Content="{Binding ChildLevel1Name}"/>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
                       <Label Content="{Binding FirstTypeName}"/>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                        <Label Content="{Binding SecondTypeName}"/>
            </HierarchicalDataTemplate>




   </TreeView.Resources>
    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
公共类MyViewModel
{
//私有只读集合_attributeMapDoc;
公共对象文件;
#区域法
私人名单(myDoc);;
公共列表MyDoc
{
获取{return\u myDoc;}
设置
{
_myDoc=值;
}
}
#端区
#区域建设者
公共MyViewModel()
{
MyDoc=新列表()
{
新的Level0ViewModel(“根”,文档),//\u文档包含来自xml文件的数据(未显示代码)
};
}
#端区
}
公共类Level0ViewModel:ViewModelBase
{
私人名单_childLevel1;
public Level0ViewModel(字符串名称,对象myObj)
{
ChildLeve0Name=姓名;
ChildLevel1=新列表()
{
新的Level1ViewModel(“Child1”,myObj),
新的Level1ViewModel(“Child2”,myObj)
};
}
公共列表级别1
{
收到
{
返回_childLevel1;
}
设置
{
SetProperty(ref _childLevel1,value,()=>childLevel1);
}
}
公共字符串ChildLeve0Name{get;set;}
}
公共类Level1ViewModel:ViewModelBase
{
私有可观察集合_childLevel2SecondType;
public ObservableCollection ChildLevel2秒类型
{
获取{return\u childLevel2SecondType;}
设置
{
if(_childLevel2SecondType!=值)
{
SetProperty(ref _childLevel2SecondType,value,()=>childLevel2SecondType);
}
}
}
私有可观察集合_childLevel2FirstType;
公共可观察集合ChildLevel2FirstType
{
获取{return\u childLevel2FirstType;}
设置
{
if(_childLevel2FirstType!=值)
{
SetProperty(ref _childLevel2FirstType,value,()=>childLevel2FirstType);
}
}
}
public Level1ViewModel(字符串名称,对象映射)
{
ChildLevel1Name=姓名;
ChildLevel2FirstType=新的ObservableCollection();
foreach(mapAtt.FirstTypes中的FirstType myFirstType)
{
添加(新的Level2FirstTypeViewModel(myFirstType));
}
ChildLevel2SecondType=新的ObservableCollection();
foreach(mapAtt.SecondTypes中的SecondType mySecondType)
{
添加(新的Level2SecondTypeViewModel(mySecondType));
}
}
公共字符串ChildLevel1Name
{
收到
设置
}
}
公共类Level2FirstTypeViewModel:ViewModelBase
{
公共级别2第一类型视图模型(第一类型fType)
{
FirstTypeName=fType.name;
}
公共字符串FirstTypeName
{
收到
设置
}
}
公共类级别2秒类型视图模型
{
公共级别2秒类型视图模型(秒类型sType)
{
SecondTypeName=sType.name;
}
公共字符串SecondTypeName
{
收到
设置
}
}

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
我尝试给我这样的东西(这根本不是我想要的!!):

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
根//级别0

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
B1-儿童1//1级

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
B1-1-儿童1-1//2级

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
B1-2-儿童1-2

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
B1-3-

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
B2-儿童2//1级

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
B2-1儿童1-1//2级

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
B2-2儿童1-2

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
B2-3

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>

扔掉这些属性:
Level1ViewModel.ChildLevel2FirstType
Level1ViewModel.ChildLevel2SecondType

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
你需要为孩子们收集一套。此集合的项类型取决于继承层次结构,并且应该是最近的公共祖先(最坏的情况是
对象
),即如下所示:

public Level1ViewModel
{
    public ObservableCollection<object> ChildLevel2
    {
        // ...
    }

    // ...
}
    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
public Level1ViewModel
{
公共可观察集合儿童级别2
{
// ...
}
// ...
}
带有这些更改的标记将如下所示:

public Level1ViewModel
{
    public ObservableCollection<object> ChildLevel2
    {
        // ...
    }

    // ...
}
    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
请注意,
HierarchycalDataTemplate
只能用于分层数据源。对于非层次结构(如
Level2FirstTypeViewModel
Level2SecondTypeViewModel
)使用常规的
DataTemplate

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
public class BaseTreeViewItem<TSource, TParent> : ViewModelBase
{

    // add static field to hold selected Item
    public static BaseTreeViewItem<TSource, TParent> SelectedChild { get; set; }

    private bool _isSelected;
    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            if (_isSelected == value) return;

            if (SelectedChild != null)
            {
                SelectedChild.IsSelected = false;
                SelectedChild = null;
            }

            _isSelected = value;

            if (_isSelected)
                SelectedChild = this;

            // NotifyPropertyChanged
        }
    }

    public TParent Parent
    {
        get;
        private set;
    }

    public BaseTreeViewItem(string name, TSource myObj, TParent parent)
    {
        ChildName = name;
        DataSource = myObj;
        Parent = parent;
    }


    public string ChildName { get; set; }
    public TSource DataSource { get; set; }

    public override string ToString()
    {
        return ChildName;
    }
}

// Node

public class MyTreeViewItem<TChild, TSource, TParent> : BaseTreeViewItem<TSource, TParent>, IDeleteItem
    where TParent : IDeleteItem
    where TChild : class
{


    public ObservableCollection<TChild> Children { get; set; }

    public MyTreeViewItem(string name, TSource myObj, TParent parent)
        :base(name,myObj, parent)
    {
        Children = new ObservableCollection<TChild>();
    }

    protected virtual void InitChild()
    {

    }

    public void DeleteItem(object myTreeViewItem)
    {
        Children.Remove(myTreeViewItem as TChild);
    }

    public static void DeleteSelectedItem()
    {
        if (SelectedChild != null && SelectedChild.Parent != null)
        {
            SelectedChild.Parent.DeleteItem(SelectedChild);
        }
    }


}

public class Level0ViewModel : MyTreeViewItem<Level1ViewModel, XmlDocument, IDeleteItem>
{
    protected override sealed void InitChild()
    {
        base.InitChild();
        Children.Add(new Level1ViewModel("Child1", new Level1Src(), this));
        Children.Add(new Level1ViewModel("Child2", new Level1Src(), this));
    }

    public Level0ViewModel(string name, XmlDocument myObj) :
        base(name, myObj,null)
    {
        InitChild();
    }
}

public class Level1ViewModel : MyTreeViewItem<Level2TypeViewModel, Level1Src, Level0ViewModel>
{
    public Level1ViewModel(string name, Level1Src myObj, Level0ViewModel parent)
        : base(name, myObj, parent)
    {
        InitChild();
    }

    protected override sealed void InitChild()
    {
        base.InitChild();
        foreach (FirstType myFirstType in DataSource.FirstTypes)
        {
            Children.Add(new Level2TypeViewModel(myFirstType, this));
        }

        foreach (SecondType mySecondType in DataSource.SecondTypes)
        {
            Children.Add(new Level2TypeViewModel(mySecondType, this));
        }
    }

    // Use linq if tou want child by type
    public IEnumerable<Level2TypeViewModel> ChildType1 
    {
        get
        {
            return Children.Where(item => item.DataSource is FirstType);
        }
    }

    public IEnumerable<Level2TypeViewModel> ChildType2
    {
        get
        {
            return Children.Where(item => item.DataSource is SecondType);
        }
    }
}

public class LevelType
{
    public string Name;
}

public class FirstType : LevelType
{
}

public class SecondType : LevelType
{
}

public class Level2TypeViewModel : BaseTreeViewItem<LevelType, Level1ViewModel>
{
    public Level2TypeViewModel(LevelType sType, Level1ViewModel parent)
        : base(sType.Name, sType, parent)
    {
    }
}
对于TreeView数据模板的使用

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
<TreeView DataContext="{Binding ElementName=UI, Path=TreeModel}">
        <TreeView.Items>
            <TreeViewItem Header="{Binding ChildName}" ItemsSource="{Binding Path=Children}" >
                <TreeViewItem.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                        <Label Content="{Binding ChildName}"></Label>
                    </HierarchicalDataTemplate>
                </TreeViewItem.ItemTemplate>
            </TreeViewItem>
        </TreeView.Items>

    </TreeView>

第一个TreeView项目是显示根节点。如果你不想使用它 您可以将数据源更改为

    <!-- Level 1 -->
    <HierarchicalDataTemplate DataType="{x:Type local:Level1ViewModel}" ItemsSource="{Binding ChildLevel2}">
              <Label Content="{Binding ChildLevel1Name}"/>
    </HierarchicalDataTemplate>

    <!-- Level 1 -->
    <DataTemplate  DataType="{x:Type local:Level2FirstTypeViewModel}">
                <Label Content="{Binding SecondTypeName}"/>
    </DataTemplate>

    <DataTemplate  DataType="{x:Type local:Level2SecondTypeViewModel}">
               <Label Content="{Binding FirstTypeName}"/>
    </DataTemplate>
public MyTreeViewItem<Level0ViewModel,object> TreeModel
        {
            get
            {
                MyTreeViewItem<Level0ViewModel,object> src = new MyTreeViewItem<Level0ViewModel, object>("Root", null);
                src.Children.Add(new Level0ViewModel("toto", new XmlDocument()));
                return src;
            }
        }
公共MyTreeViewItem树模型
{
收到
{
MyTreeViewItem src=新的MyTreeViewItem(“根”,null);
src.Children.Add(