C# wpf Treeview中有三个级别

C# wpf Treeview中有三个级别,c#,wpf,C#,Wpf,我是一名初学者,正在尝试创建第一个包含三个级别的treeView的应用程序 第一级显示进程的名称 第二级显示其修复的模块和线程 第三级包含子模块和子线程 proc1 Module subMod1 Thread thread1 proc2

我是一名初学者,正在尝试创建第一个包含三个级别的treeView的应用程序
第一级显示进程的名称
第二级显示其修复的模块和线程
第三级包含子模块和子线程

 proc1      
    Module      
      subMod1     
   Thread      
      thread1                        
 proc2                                                                            
   Module
     submod1
   Thread
     subThread  
这是xmal.cs文件

public partial class MainWindow : Window
{


    public MainWindow()
    {


        InitializeComponent();

        for (int i = 0; i <= 3; i++)
        {
            Module mod = new Module
            {
                modulelist = new List<moduleList>() { new moduleList {           Name = "mod1" } ,
             new moduleList { Name = "mod1" } }
            };
            Thread th = new Thread
            {
                threadlist = new List<threadList>() { new threadList { Name = "thread1" } ,
             new threadList { Name = "thread1" } }
            };
            ProcName proc1 = new ProcName { Name = "proc" + i, mod = new Module(), th = new Thread() };
            tv.DataContext = proc1;
        }
    }

    public class ProcName
    {

        public string Name
        { get; set; }
        public Module mod = new Module();
        public Thread th = new Thread();

    }
    public class Module
    {
        public string Name = "Module";
        public List<moduleList> modulelist
        { get; set; }
    }
    public class moduleList
    {
        public string Name
        { get; set; }
    }
    public class Thread {
        public string Name = "Thread";
        public List<threadList> threadlist
        { get; set; }
    }
    public class threadList
    {
        public string Name
        { get; set; }
    }


}  
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
对于(int i=0;i

您可以使用
界面
使其正常工作

xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var subNodes = new List<ITreeNode>
        {
            new SubNode { Name = "Sub Node 1" },
            new SubNode { Name = "Sub Node 2" },
            new SubNode { Name = "Sub Node 3" },
            new SubNode { Name = "Sub Node 4" }
        };
        var nodes = new List<ITreeNode>
        {
            new Thread { Name = "Thread 1", ChildNodes = subNodes },
            new Thread { Name = "Thread 2", ChildNodes = subNodes },
            new Module { Name = "Module 1", ChildNodes = subNodes },
            new Module { Name = "Module 2", ChildNodes = subNodes }
        };
        var processes = new List<Process>
        {
            new Process{ Name = "Process1", ChildNodes = nodes },
            new Process{ Name = "Process2", ChildNodes = nodes }
        };
        TreeView.ItemsSource = processes;
    }
}
public interface ITreeNode
{
    string Name { get; set; }
    List<ITreeNode> ChildNodes { get; set; }
}
public class Process : ITreeNode
{
    public string Name { get; set; }
    public int ID { get; set; }
    public List<ITreeNode> ChildNodes { get; set; }
}
public class Module : ITreeNode
{
    public string Name { get; set; }
    public List<ITreeNode> ChildNodes { get; set; }
}
public class Thread : ITreeNode
{
    public string Name { get; set; }
    public int ID { get; set; }        
    public List<ITreeNode> ChildNodes { get; set; }
}
public class SubNode : ITreeNode
{
    public string Name { get; set; }
    public List<ITreeNode> ChildNodes { get => null; set => throw new System.NotImplementedException(); }
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
var子节点=新列表
{
新的子节点{Name=“Sub Node 1”},
新的子节点{Name=“Sub Node 2”},
新的子节点{Name=“Sub Node 3”},
新子节点{Name=“Sub Node 4”}
};
var节点=新列表
{
新线程{Name=“Thread 1”,子节点=子节点},
新线程{Name=“Thread 2”,子节点=子节点},
新模块{Name=“模块1”,子节点=子节点},
新模块{Name=“模块2”,子节点=子节点}
};
var进程=新列表
{
新进程{Name=“Process1”,ChildNodes=nodes},
新进程{Name=“Process2”,ChildNodes=nodes}
};
TreeView.ItemsSource=进程;
}
}
公共接口ITreeNode
{
字符串名称{get;set;}
列出子节点{get;set;}
}
公共类进程:ITreeNode
{
公共字符串名称{get;set;}
公共int ID{get;set;}
公共列表子节点{get;set;}
}
公共类模块:ITreeNode
{
公共字符串名称{get;set;}
公共列表子节点{get;set;}
}
公共类线程:ITreeNode
{
公共字符串名称{get;set;}
公共int ID{get;set;}
公共列表子节点{get;set;}
}
公共类子节点:ITreeNode
{
公共字符串名称{get;set;}
公共列表子节点{get=>null;set=>throw new System.NotImplementedException();}
}
xaml

如果级别不需要不同的模板,可以使用

<TreeView x:Name="TreeView">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}">
            <TextBlock Margin="3" Text="{Binding Name}"/>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>            
</TreeView>

如果你需要不同的级别模板,你可以使用这样的东西

<TreeView x:Name="TreeView">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:Process}" ItemsSource="{Binding ChildNodes}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Path=Name, StringFormat='{}{0} '}" />
                <TextBlock Text="{Binding Path=ID, StringFormat=(ID: {0})}" />
            </StackPanel>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type local:Module}" ItemsSource="{Binding ChildNodes}">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type local:Thread}" ItemsSource="{Binding ChildNodes}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Path=Name, StringFormat='{}{0} '}" />
                <TextBlock Text="{Binding Path=ID, StringFormat=(ID: {0})}" />
            </StackPanel>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type local:SubNode}" ItemsSource="{Binding ChildNodes}">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>


您的数据类与您的树不匹配,这是第一个问题。一个进程可以有多个线程吗?多个模块吗?是的,一个进程有多个模块和线程。它运行得非常完美,但我有点困惑,因为在我的例子中,模块和线程不共享相同的子节点,原因是eac进程有不同的线程和不同的模块。您可以创建另一个
子节点
,并像
模块
线程
类一样使用它。它将是
var subNodes=new List{new SubNode1{Name=“Sub Node 1”},new SubNode1{Name=“SubNode 2”},new SubNode2{Name=“Sub Node 3”},new subnode 2{Name=“Sub Node 4”};
我做了类似的事情,为模块公共类添加了一个子类
subnode 1:ITreeNode{public string Name{get;set;}公共列表子节点{get=>null;set=>throw new System.NotImplementedException();}然后创建变量var SubNode1=new List{new SubNode1{Name=“Sub node11”},},然后将其用作新模块{Name=“Module 2”,ChildNodes=SubNode1}
但它工作不正常,子节点1的输出为
wpfexample。子节点1
我发现了错误。现在它已解决,工作正常,感谢您的帮助和努力
<TreeView x:Name="TreeView">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:Process}" ItemsSource="{Binding ChildNodes}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Path=Name, StringFormat='{}{0} '}" />
                <TextBlock Text="{Binding Path=ID, StringFormat=(ID: {0})}" />
            </StackPanel>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type local:Module}" ItemsSource="{Binding ChildNodes}">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type local:Thread}" ItemsSource="{Binding ChildNodes}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Path=Name, StringFormat='{}{0} '}" />
                <TextBlock Text="{Binding Path=ID, StringFormat=(ID: {0})}" />
            </StackPanel>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type local:SubNode}" ItemsSource="{Binding ChildNodes}">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>