如何将对象及其属性绑定到树视图

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 成为树中的一片叶子。