【问题标题】:C# Binding treeview to list of nested structureC# 将树视图绑定到嵌套结构列表
【发布时间】:2017-08-11 12:01:53
【问题描述】:

我正在尝试将级别 3 的列表绑定到 wpf mvvm 中的树视图。我通过调用模型类中的函数得到这个列表。我有如下的类结构。

namespace Projectname.Model
{
 class Gate
{
    public string Name { get; set; }
    public string Location { get; set; }
    public string IP { get; set; }
    public int Port { get; set; }
    public string GateMode { get; set; }
    public string Type { get; set; }
    public string Status { get; set; }
};

class Floor
{
    public string Name { get; set; }
    public List<Gate> Gates { get; set; }
};

 class Building
{
    public string Name { get; set; }
    public List<Floor> Floors { get; set; }
};
}

以下是我尝试过的。这里我不知道如何给出数据类型。

      <TreeView ItemsSource="{Binding Buildings}" Margin="10" Height="200">
                    <TreeView.Resources>
                        <HierarchicalDataTemplate ItemsSource="{Binding Buildings}" DataType="{x:Type local:Building}">
                            <TreeViewItem Header="{Binding Name}"/>
                        </HierarchicalDataTemplate>

                    </TreeView.Resources>

                </TreeView>

属性

    Window x:Class="projectname.MainWindow"
    xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:local="clr-namespace:projectname.Model"

我可以显示建筑物名称,但像下面的一样,不像树 如下图所示。

感谢任何帮助。

【问题讨论】:

    标签: c# wpf mvvm binding treeview


    【解决方案1】:

    您必须在&lt;TreeView.Resources&gt; 中指定模板,并且必须指定它们不是嵌套的。

    例如,这可能看起来像(仅作为 FloorDoor 的示例)。

    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:Floor}" ItemsSource="{Binding Gates}">
            <TextBlock Text="{Binding Name}" />
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Floors}" DataType="{x:Type local:Building}">
            <TextBlock Header="{Binding Name}"/>
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type local:Gate}">
            <TextBlock Text="{Binding Name}" />
        </DataTemplate>
    </TreeView.Resources>
    

    如果您有一个可以有子节点的节点,请使用HierarchicalDataTemplate 并将DataType 设置为它应该显示的类,并将ItemsSource 设置为带有子节点的集合。

    重要

    您的 DoorFloor 等结构必须是 public 并且没有嵌套,我建议改用类。

    有了这个示例数据

    new Floor
    {
        Name = "Floor 1",
        Doors = new List<Door>
        {
            new Door { Name = "Door 1"},
            new Door {Name = "Door 2" }
        }
    },
    new Floor
    {
        Name = "Floor 2",
        Doors = new List<Door>
        {
            new Door { Name = "Door 3"},
            new Door {Name = "Door 4" }
        }
    }
    

    看起来像

    编辑命名空间问题

    您必须在 xaml.xml 中指定命名空间。

    例如,您的 Floor 位于命名空间 MyProject.ViewModel 中,您必须在 xaml 中添加 xmlns:something="clr-namespace:MyProject.ViewModel" 并在模板中使用 DataType="{x:Type something:Floor}"

    编辑

    改变

    xmlns:local="clr-namespace:projectname.Model"
    

    xmlns:local="clr-namespace:CentralizedControlHMI.Model"
    

    然后将FloorGate 等设为public,因为默认为private

    public class Floor
    

    【讨论】:

    • 地板在本地不可用,因为我正在创建这个窗口,它在视图模型中显示结构,并且我只在那里提供数据上下文。也请看现在的结构。它就像地板内的门和建筑物内的地板。谢谢
    • 使它成为 oublic 并且该类型将可用。并且不要让它嵌套在另一个类中。创建实例的位置无关紧要。
    • @RPK 编辑了我的答案:使用我提供的代码添加了示例数据和示例输出。
    • 我现在可以访问数据了。我会继续努力按照你的建议实施
    • @RPK 祝你好运,如果您需要更多帮助,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多