C# 如何将对象及其属性绑定到treeview
我有一份设备清单。它们只有名称和设备信息列表。 这些设备信息有一个键和值。现在我想构建一个树视图,它显示每个设备,并作为树视图项显示所有值。我不知道如何在XAML中绑定它 我正在使用.NETFramework4.8C# 如何将对象及其属性绑定到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;} }
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>