wpf Treeview с тремя уровнями в - PullRequest
0 голосов
/ 08 июня 2018

Я новичок и пытаюсь создать свое первое приложение, которое содержит treeView с тремя уровнями
Первый уровень показывает имя процесса
Второй уровень показывает его модули и потоки, которые являются исправленными
Третий уровеньсодержит подмодули и подпотоки

 proc1      
    Module      
      subMod1     
   Thread      
      thread1                        
 proc2                                                                            
   Module
     submod1
   Thread
     subThread  

это xmal.cs file

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; }
    }


}  

Это xmal file

<TreeView Name="tv" ItemsSource="{Binding}">

    <TreeView.ItemTemplate>

        <HierarchicalDataTemplate ItemsSource="{Binding ProcName}">
            <TextBlock Margin="3" Text="{Binding Name}"/>
            <!-- child node will be a MasterAction -->
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Module}">
                    <TextBlock Text="{Binding Name}"/>
                    <!-- leaf will be a SlaveAction -->
                    <HierarchicalDataTemplate.ItemTemplate ItemSource ="{Binding moduleList} ">
                        <DataTemplate>
                            <TextBlock Text="{Binding Name}"/>
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Thread}">
                    <TextBlock Text="{Binding Name}"/>
                    <!-- leaf will be a SlaveAction -->
                    <HierarchicalDataTemplate.ItemTemplate ItemSource   ="{Binding threadList} ">
                        <DataTemplate>
                            <TextBlock Text="{Binding Name}"/>
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                    </
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
</Window>

Я знаю, что это не правильно, но попытался сделать это так
Как правильно его использовать?

1 Ответ

0 голосов
/ 08 июня 2018

Вы можете использовать Interface, чтобы получить эту работу.

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(); }
}

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...