C# 如何将对象及其属性绑定到treeview

C# 如何将对象及其属性绑定到treeview,c#,wpf,binding,treeview,C#,Wpf,Binding,Treeview,我有一份设备清单。它们只有名称和设备信息列表。 这些设备信息有一个键和值。现在我想构建一个树视图,它显示每个设备,并作为树视图项显示所有值。我不知道如何在XAML中绑定它 我正在使用.NETFramework4.8 public class Device { public string Name {get; set;} public List<DeviceInfo> deviceInfos {get; set;} }

我有一份设备清单。它们只有名称和设备信息列表。 这些设备信息有一个键和值。现在我想构建一个树视图,它显示每个设备,并作为树视图项显示所有值。我不知道如何在XAML中绑定它

我正在使用.NETFramework4.8


    public class Device
    {
        public string Name {get; set;}
        public List<DeviceInfo> deviceInfos {get; set;}
    }
    
    public class DeviceInfo
    {
        public int key {get; set;}
        public value values {get; set;}
    }
    
    public class values
    {
         public string Type {get; set;}
         public string TypeName {get; set;}
    }
    
    public List<Device> devices {get; set;}

编辑
对不起,问题不清楚。我让它为根工作。所以我看到了deviceName,我可以展开它。但是我不能显示设备信息。已更改的财产在其他地方处理。我只是把它留了下来

这一部分正在发挥作用:


<TreeView ItemsSource="{Binding devices}" Margin="2">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Device}">
            <TreeViewItem Header="{Binding name}">
            </TreeViewItem>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>


您应该添加从Nuget和

public class Device : INotifyPropertyChanged
{
    public string name {get;set;}
    public ObservableCollection<DeviceInfo> deviceInfos {get;set;}
    public event PropertyChangedEventHandler PropertyChanged = (sender, e) 
}

public class DeviceInfo : INotifyPropertyChanged
{
    public int key {get;set;}
    public values value {get;set;}
    public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };
}

public class values : INotifyPropertyChanged
{
     public string Type {get;set;}
     public string TypeName {get;set;}
     public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };
}
公共类设备:INotifyPropertyChanged
{
公共字符串名称{get;set;}
公共ObservableCollection设备信息{get;set;}
公共事件PropertyChangedEventHandler PropertyChanged=(发送方,e)
}
公共类设备信息:INotifyPropertyChanged
{
公共int密钥{get;set;}
公共值值{get;set;}
公共事件PropertyChangedEventHandler PropertyChanged=(发送方,e)=>{};
}
公共类值:INotifyPropertyChanged
{
公共字符串类型{get;set;}
公共字符串类型名{get;set;}
公共事件PropertyChangedEventHandler PropertyChanged=(发送方,e)=>{};
}
然后,您可以对
ObservableCollection设备{get;set;}

编辑:我不知道如何使用treeview,因为我从来都不需要它。但是您可以通过多次调整绑定来实现您的目标


这行代码看起来错误,因为没有名为“设备”的属性。

您应该为每种类型定义一个模板:

<TreeView ItemsSource="{Binding devices}" Margin="2">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:Device}" ItemsSource="{Binding deviceInfos}">
            <TextBlock Text="{Binding Name}" />
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type local:DeviceInfo}">
            <TextBlock Text="{Binding values.Type}" />
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>


如果希望能够展开
DeviceInfo
,则它必须具有
IEnumerable
属性。您的
类型似乎不是一个
IEnumerable
,它实际上使
DeviceInfo
成为树中的一片叶子。

PropertyChanged=(sender,e)=>{}这样的空事件处理程序将降低足够大的应用程序的速度
PropertyChanged?.Invoke()
是首选。感谢您的帮助。但我在项目的其他地方处理了这个属性的更改。@DerHelm您不能绑定到字段。你知道吗?若你们在项目中的课程和你们在这里发布的完全一样。这行不通
public class Device : INotifyPropertyChanged
{
    public string name {get;set;}
    public ObservableCollection<DeviceInfo> deviceInfos {get;set;}
    public event PropertyChangedEventHandler PropertyChanged = (sender, e) 
}

public class DeviceInfo : INotifyPropertyChanged
{
    public int key {get;set;}
    public values value {get;set;}
    public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };
}

public class values : INotifyPropertyChanged
{
     public string Type {get;set;}
     public string TypeName {get;set;}
     public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };
}
<TreeView ItemsSource="{Binding devices}" Margin="2">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:Device}" ItemsSource="{Binding deviceInfos}">
            <TextBlock Text="{Binding Name}" />
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type local:DeviceInfo}">
            <TextBlock Text="{Binding values.Type}" />
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>