C# 在XAML中绑定树视图上的2层数据

C# 在XAML中绑定树视图上的2层数据,c#,wpf,xaml,treeview,C#,Wpf,Xaml,Treeview,这里是XAML noobie! 这是我现在得到的: MachineList是机器对象的列表(我创建的自定义类) 每台机器内部都有一个驱动器列表(驱动器是另一类) 现在我需要列出这些,让用户检查一些机器或驱动器,显示一些驱动器信息。我的第一个目标是将我的机器列表绑定到一个树状视图(对于根元素)上,并为级别1的孩子绑定驱动器,但我真的做不到 下面是我正在做的: <TreeView ItemsSource="{Binding MachineList}" Name="treeView1">

这里是XAML noobie! 这是我现在得到的:

  • MachineList是机器对象的列表(我创建的自定义类)
  • 每台机器内部都有一个驱动器列表(驱动器是另一类)
现在我需要列出这些,让用户检查一些机器或驱动器,显示一些驱动器信息。我的第一个目标是将我的机器列表绑定到一个树状视图(对于根元素)上,并为级别1的孩子绑定驱动器,但我真的做不到

下面是我正在做的:

<TreeView ItemsSource="{Binding MachineList}" Name="treeView1">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding DriveList}">
            <TextBlock Text="{Binding driveName}" />
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

下面是我如何用C代码声明MachineList的:

publicobservableCollection机器列表{get;set;}
正如我在调试期间可以验证的那样,我的MachineList包含正确的数据(即使驱动器列表已正确填写),但我的Treeview上没有显示任何内容。驱动列表是一个
可观察的集合
对象


我做错了什么?

按如下所示设置HierarchycalDataTemplate的ItemTemplate

<TreeView ItemsSource="{Binding MachineList}" Name="treeView1">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding DriveList}">
                    <TextBlock Text="{Binding machineName}" />
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding driveName}" />
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

更新(我尝试过的适合我的代码):

公共类机器
{
私有字符串machinename;
公共字符串机器名
{
获取{return machinename;}
设置{machinename=value;}
}
私有可观察收集驱动列表;
公共可观察收集驱动器列表
{
获取{返回驱动器列表;}
设置{driveList=value;}
}
}
公共类视图模型
{
私人可观测采集机;
公共可观测采集机械师
{
获取{返回机器;}
设置{machines=value;}
}
公共视图模型()
{
ObservableCollection列表=新的ObservableCollection();
添加(newdrivelist(){driveName=“Drive 1”});
机器=新的可观察集合();
添加(新机器(){machineName=“Machine 1”,DriveList=list});
}
}
公共类驱动列表
{
私有字符串驱动器名;
公共字符串驱动器名
{
获取{return drivename;}
设置{drivename=value;}
}
}

谢谢你的建议,但我的名单还是空的!我尝试了预编辑和后编辑代码:(您是否正确设置了DataContext,属性名称是否正确?我搜索了DataContext,但找不到太多关于它的信息!我尝试了设置treeView1.DataConxt=MachineList,但没有设置与此类似的更改。DataContext=new ViewModel()谢谢!现在我让它开始工作了:D我必须更改我的主要TreeView绑定,这里是它的工作原理:{x:Static local:ProjectName.MachineList},我必须使Static成为我的MachineList!我真的需要抓起一本巨大的XAML书籍,好好研究一下:P
<TreeView ItemsSource="{Binding MachineList}" Name="treeView1">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding DriveList}">
                    <TextBlock Text="{Binding machineName}" />
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding driveName}" />
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
public class Machines
    {
        private string machinename;

        public string machineName
        {
            get { return machinename; }
            set { machinename = value; }
        }
        private ObservableCollection<DriveList> driveList;

        public ObservableCollection<DriveList> DriveList
        {
            get { return driveList; }
            set { driveList = value; }
        }


    }

    public class ViewModel
    {
        private ObservableCollection<Machines> machines;

        public ObservableCollection<Machines> MachineList
        {
            get { return machines; }
            set { machines = value; }
        }
        public ViewModel()
        {
            ObservableCollection<DriveList> list= new ObservableCollection<DriveList>();
            list.Add(new DriveList() { driveName = "Drive 1" });
            machines = new ObservableCollection<Machines>();
            machines.Add(new Machines() { machineName = "Machine 1", DriveList =list  });
        }
    }

    public class DriveList
    {
        private string drivename;

        public string driveName
        {
            get { return drivename; }
            set { drivename = value; }
        }
    }