具有多种类型的 wpf 树视图 [英] wpf treeview with multiple types

查看:30
本文介绍了具有多种类型的 wpf 树视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在阅读教程并在线阅读一些关于树视图中多种类型的文章.但是,我还没有遇到解释如何构建或处理包含多个不同节点类型嵌套的树视图的教程.例如,考虑一个典型的文件夹结构.一个文件夹中可以包含文件和文件夹,而其中的文件夹可以包含更多文件和文件夹.因此,我试图将其分解为一个简单的解决方案,希望有人可以修改/向我解释如何将一个家庭嵌套在另一个家庭中,如下图所示.另一个堆栈溢出的链接没有详细解释 INode 接口的工作原理.

I've been going over tutorials and reading a few articles online about multiple types in treeviews. However I've not come across a tutorial which explains how to build or handle a treeview which contains multiple different node types nested. For example think of a typical folder structure. A folder can contain files and folders within, and the folders within that can contain more files and folders. So I've attempted to break this down into a simple solution hoping someone can modify/explain to me how to get a family nested inside of another family as seen in the image below. The link to the other stack overflow doesn't explain how the INode interface works in detail.

从我读过的内容来看,我知道我需要三门课.

From what i've read i know i'll need three classes.

  1. 第 1 类:FamilyNode

  1. Class 1: FamilyNode

  • 这个类包含3个属性Members、Name、Parent

第 2 类:家庭成员

  • 这个类包含 2 个属性 Name、Age

第 3 类:INode

Class 3: INode

  • 这个类包含 1 个属性名称.为此类创建 INode 接口将允许我们为您在 Treeview 中想要的每个内容项创建不同的实现.我相信这个类的一个例子会像这样......

<小时>

public interface INode
{
     string Name { get; }
     string Path { get; }
}

<小时>

下面是上图中当前"下的代码.我知道它没有以最好的方式组织起来,我只是想得到一个简单的例子和​​解释.我希望你们能帮上忙,为此研究起来很费时间.我只是可以围绕如何制作可能是 Family 或 FamilyMember 类型的节点集合来开始构建树视图.感谢大家的帮助.


Below is the code for what's seen in the picture above under 'current'. I know it's not organized out in the best way possible, i'm just looking to get a simple example and explanation. I hope you guys can help, its been time consuming researching for this. I just can wrap my head around how to make a collection of nodes which could be of type Family or FamilyMember to then begin building the treeview. Thanks for the help guys.

ViewModel.cs

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;

    namespace WpfApplication1
    {
        public class ViewModel : INotifyPropertyChanged
        {
            private ObservableCollection<Family> families;
            public ObservableCollection<Family> Families
            {
                get { return families; }
                set
                {
                    families = value;
                    NotifyPropertyChanged("Families");
                }
            }

            public ViewModel()
            {
                // FAMILIES
                Families = new ObservableCollection<Family>();

                Family family1 = new Family() { Name = "The Doe's" };
                family1.Members.Add(new FamilyMember() { Name = "John Doe", Age = 42 });
                family1.Members.Add(new FamilyMember() { Name = "Jane Doe", Age = 39 });
                family1.Members.Add(new FamilyMember() { Name = "Sammy Doe", Age = 13 });
                Families.Add(family1);

                Family family2 = new Family() { Name = "The Moe's" };
                family2.Members.Add(new FamilyMember() { Name = "Mark Moe", Age = 31 });
                family2.Members.Add(new FamilyMember() { Name = "Norma Moe", Age = 28 });
                Families.Add(family2);
            }

            public event PropertyChangedEventHandler PropertyChanged;

            public void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }

        public class Family
        {
            public Family()
            {
                this.Members = new ObservableCollection<FamilyMember>();
            }

            public string Name { get; set; }
            public ObservableCollection<FamilyMember> Members { get; set; }
        }

        public class FamilyMember
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }
    }

MainWindow.Xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:self="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="305"
        WindowStartupLocation="CenterScreen">

    <Window.DataContext>
        <self:ViewModel/>
    </Window.DataContext>

    <Grid>
        <TreeView Name="trvFamilies" ItemsSource="{Binding Families}" Grid.Row="1" Grid.ColumnSpan="2">
            <TreeView.Resources>
                <HierarchicalDataTemplate DataType="{x:Type self:Family}" ItemsSource="{Binding Members}">
                    <StackPanel Orientation="Horizontal">
                        <Label VerticalAlignment="Center" FontFamily="WingDings" Content="1"/>
                        <TextBlock Text="{Binding Name}" />
                    </StackPanel>
                </HierarchicalDataTemplate>
                <DataTemplate DataType="{x:Type self:FamilyMember}">
                    <StackPanel Orientation="Horizontal">
                        <Label VerticalAlignment="Center" FontFamily="WingDings" Content="2"/>
                        <TextBlock Text="{Binding Name}" />
                    </StackPanel>
                </DataTemplate>
            </TreeView.Resources>
        </TreeView>
    </Grid>

</Window>

推荐答案

我和朋友讨论后想出了解决方案,并想把它贴在这里.

I figured out the solution talking with a friend and figured i would post it here.

ViewModel.cs

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace WpfApplication1
{
    public class ViewModel : INotifyPropertyChanged
    {
        private ObservableCollection<INode> families;
        public ObservableCollection<INode> Families
        {
            get { return families; }
            set
            {
                families = value;
                NotifyPropertyChanged("Families");
            }
        }

        public ViewModel()
        {
            // FAMILIES
            Families = new ObservableCollection<INode>();

            Family family1 = new Family() { Name = "The Doe's" };
            family1.Members.Add(new FamilyMember() { Name = "John Doe", Age = 42 });
            family1.Members.Add(new FamilyMember() { Name = "Jane Doe", Age = 39 });
            family1.Members.Add(new FamilyMember() { Name = "Sammy Doe", Age = 13 });
            Families.Add(family1);

            Family family2 = new Family() { Name = "The Moe's" };
            family2.Members.Add(new FamilyMember() { Name = "Mark Moe", Age = 31 });
            family2.Members.Add(new FamilyMember() { Name = "Norma Moe", Age = 28 });
            Families.Add(family2);

            Family family3 = new Family() { Name = "The Dunkin's" };
            family3.Members.Add(new FamilyMember() { Name = "Kevin Dunkin", Age = 31 });
            family3.Members.Add(new FamilyMember() { Name = "Breana Dunkin", Age = 28 });
            family2.Members.Add(family3);
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

    public interface INode
    {
        string Name { get; }
    }

    public class Family : INode
    {
        public Family()
        {
            this.Members = new ObservableCollection<INode>();
        }

        public string Name { get; set; }
        public ObservableCollection<INode> Members { get; set; }
        public Family Parent { get; private set; }
    }

    public class FamilyMember : INode
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

这篇关于具有多种类型的 wpf 树视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆