如何将对象及其属性绑定到树视图
How to bind an object and its properties to a treeview
我得到了设备列表。这些只有名称和 DeviceInfos 列表。
这些 DeviceInfos 有一个 Key 和 Values。现在我想构建一个 treeView 来显示每个设备,并将所有值显示为 treeviewitems。而且我不知道如何在 XAML.
中绑定它
我正在使用 .NET Framework 4.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;}
<TreeView ItemsSource="{Binding devices}" Margin="2">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Device}">
<TreeViewItem Header="{Binding name}">
<TreeViewItem ItemsSource="{Binding deviceInfos}" Header="{Binding TypeName}">
</TreeViewItem>
</TreeViewItem>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
计划的结果应如下所示:
+ Device
+ DeviceInfo.Value.Type
DeviceInfo.ValueTypeName
+ Device3
+ DeviceInfo.Value.Type
DeviceInfo.ValueTypeName
+ DeviceInfo.Value.Type
DeviceInfo.ValueTypeName
+ DeviceInfo.Value.Type
DeviceInfo.ValueTypeName
+ Device3
+ DeviceInfo.Value.Type
DeviceInfo.ValueTypeName
编辑
对不起,不清楚的问题。我让它为根工作。所以我看到了 deviceName 并且我可以展开它。但我无法显示 DeviceInfos。 propertychanged 在别处处理。我只是为了缩短而忽略了它。
这部分正在运行:
<TreeView ItemsSource="{Binding devices}" Margin="2">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Device}">
<TreeViewItem Header="{Binding name}">
</TreeViewItem>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
您应该从 Nuget 添加您的项目 Fody.PropertyChanged 并且
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) => { };
}
然后您可以对 ObservableCollection<Device> devices {get;set;}
进行绑定
编辑:我不知道如何使用树视图,因为我从来不需要它。但是您可以通过多次调整绑定来实现您的目标。
这行代码看起来不对 <HierarchicalDataTemplate ItemsSource="{Binding Device}">
因为没有 属性 命名为 'Device'
您应该为每种类型定义一个模板:
<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
属性。您的 values
类型似乎不是 IEnumerable
,它有效地使 DeviceInfo
成为树中的一片叶子。
我得到了设备列表。这些只有名称和 DeviceInfos 列表。 这些 DeviceInfos 有一个 Key 和 Values。现在我想构建一个 treeView 来显示每个设备,并将所有值显示为 treeviewitems。而且我不知道如何在 XAML.
中绑定它我正在使用 .NET Framework 4.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;}
<TreeView ItemsSource="{Binding devices}" Margin="2">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Device}">
<TreeViewItem Header="{Binding name}">
<TreeViewItem ItemsSource="{Binding deviceInfos}" Header="{Binding TypeName}">
</TreeViewItem>
</TreeViewItem>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
计划的结果应如下所示:
+ Device
+ DeviceInfo.Value.Type
DeviceInfo.ValueTypeName
+ Device3
+ DeviceInfo.Value.Type
DeviceInfo.ValueTypeName
+ DeviceInfo.Value.Type
DeviceInfo.ValueTypeName
+ DeviceInfo.Value.Type
DeviceInfo.ValueTypeName
+ Device3
+ DeviceInfo.Value.Type
DeviceInfo.ValueTypeName
编辑
对不起,不清楚的问题。我让它为根工作。所以我看到了 deviceName 并且我可以展开它。但我无法显示 DeviceInfos。 propertychanged 在别处处理。我只是为了缩短而忽略了它。
这部分正在运行:
<TreeView ItemsSource="{Binding devices}" Margin="2">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Device}">
<TreeViewItem Header="{Binding name}">
</TreeViewItem>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
您应该从 Nuget 添加您的项目 Fody.PropertyChanged 并且
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) => { };
}
然后您可以对 ObservableCollection<Device> devices {get;set;}
编辑:我不知道如何使用树视图,因为我从来不需要它。但是您可以通过多次调整绑定来实现您的目标。
这行代码看起来不对 <HierarchicalDataTemplate ItemsSource="{Binding Device}">
因为没有 属性 命名为 'Device'
您应该为每种类型定义一个模板:
<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
属性。您的 values
类型似乎不是 IEnumerable
,它有效地使 DeviceInfo
成为树中的一片叶子。