【问题标题】:TreeView binding to a class with a list of another class (and so on)TreeView 绑定到具有另一个类列表的类(等等)
【发布时间】:2014-09-07 15:01:46
【问题描述】:

我尝试了所有方法,但无论我如何配置HierarchicalDataTemplate,它始终只显示集合的顶层(StarSystem 项目和StarSystemName 属性)

这就是我的TreeView 现在的配置方式:

<TreeView x:Name="StarSystemTreeView" ItemsSource="{Binding StarSystems, ElementName=window}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding}">
            <TextBlock Text="{Binding Path=StarSystemName}"/>
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Path=Planets}">
                    <TextBlock Text="{Binding Path=PlanetNumber}"/>
                    <HierarchicalDataTemplate.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding Path=Moons}">
                            <TextBlock Text="{Binding Path=MoonNumber}"/>
                            <HierarchicalDataTemplate.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Path=MoonMinerals}"/>
                                </DataTemplate>
                            </HierarchicalDataTemplate.ItemTemplate>
                        </HierarchicalDataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

window 是我的MainWindow 类,其中StarSystems 被初始化:

public partial class MainWindow
{
    private ObservableCollection<StarSystem> _starSystems = new ObservableCollection<StarSystem>
    {
        new StarSystem("FooSystem",
            new ObservableCollection<Planet>
            {
                new Planet(1, new ObservableCollection<Moon>
                {
                    new Moon(1, new ObservableCollection<string>
                    {
                        "FooMineral"
                    })
                })
            })
    };

    public ObservableCollection<StarSystem> StarSystems
    {
        get { return _starSystems; }
        set { _starSystems = value; }
    }
}

我想绑定到 TreeView 的 3 个类在 MainWindow 类之外定义,在同一个命名空间中:

[NotifyPropertyChanged]
public class StarSystem
{
    public StarSystem()
        : this("", new ObservableCollection<Planet>())
    {
    }
    public StarSystem(string starSystemName, ObservableCollection<Planet> planets)
    {
        StarSystemName = starSystemName;
        Planets = planets;
    }

    public string StarSystemName { get; set; }
    public ObservableCollection<Planet> Planets { get; set; }
}

[NotifyPropertyChanged]
public class Planet
{
    public Planet()
        : this(0, new ObservableCollection<Moon>())
    {
    }
    public Planet(int planetNumber, ObservableCollection<Moon> moons)
    {
        PlanetNumber = planetNumber;
        Moons = moons;
    }

    public int PlanetNumber { get; set; }
    public ObservableCollection<Moon> Moons { get; set; }
}

[NotifyPropertyChanged]
public class Moon
{
    public Moon()
        : this(0, new ObservableCollection<string>())
    {
    }
    public Moon(int moonNumber, ObservableCollection<string> moonMinerals)
    {
        MoonNumber = moonNumber;
        MoonMinerals = moonMinerals;
    }

    public int MoonNumber { get; set; }
    public ObservableCollection<string> MoonMinerals { get; set; }
}

这是启动应用程序后的样子:

过去 3 天我一直在努力解决这个问题,我想我已经尝试了所有可能的方法来配置 HierarchicalDataTemplate,所以我可能只是做错了什么......

【问题讨论】:

    标签: c# wpf binding treeview


    【解决方案1】:

    ItemTemplate 有点乱。您已将 ItemSource 设置为下一级层次结构。应该是:

    <TreeView x:Name="StarSystemTreeView"
              ItemsSource="{Binding StarSystems, ElementName=window}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Path=Planets}">
                <TextBlock Text="{Binding Path=StarSystemName}"/>
                <HierarchicalDataTemplate.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Path=Moons}">
                        <TextBlock Text="{Binding Path=PlanetNumber}"/>
                        <HierarchicalDataTemplate.ItemTemplate>
                            <HierarchicalDataTemplate
                                        ItemsSource="{Binding Path=MoonMinerals}">
                                <TextBlock Text="{Binding Path=MoonNumber}"/>
                                <HierarchicalDataTemplate.ItemTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding}"/>
                                    </DataTemplate>
                                </HierarchicalDataTemplate.ItemTemplate>
                            </HierarchicalDataTemplate>
                        </HierarchicalDataTemplate.ItemTemplate>
                    </HierarchicalDataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
    

    【讨论】:

    • 哇...我知道这很愚蠢。它现在没有问题。我猜 WPF 绑定比我想象的要难:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 2012-07-11
    • 2020-03-12
    • 2021-06-13
    • 2017-08-22
    相关资源
    最近更新 更多