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

Posted

技术标签:

【中文标题】如何将对象及其属性绑定到树视图【英文标题】:How to bind an object and its properties to a treeview 【发布时间】:2020-03-06 23:27:48 【问题描述】:

我得到了一个设备列表。这些只有名称和 DeviceInfo 列表。 这些 DeviceInfos 有一个键和值。现在我想构建一个树视图,它显示每个设备并将所有值作为树视图项。而且我不知道如何在 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>

【问题讨论】:

【参考方案1】:

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

<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 成为树上的叶子。

【讨论】:

【参考方案2】:

您应该从 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&lt;Device&gt; devices get;set;

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

这行代码看起来不对&lt;HierarchicalDataTemplate ItemsSource="Binding Device"&gt;,因为没有名为“设备”的属性

【讨论】:

PropertyChanged = (sender, e) =&gt; 这样的空事件处理程序减慢足够大的应用程序。 PropertyChanged?.Invoke() 是首选 感谢您的帮助。但我在我的项目的其他地方处理了这个属性更改。 @DerHelm 您无法绑定到字段。你知道吗?如果您在项目中的课程与您在此处发布的完全一样。它不会工作

以上是关于如何将对象及其属性绑定到树视图的主要内容,如果未能解决你的问题,请参考以下文章

将图像添加到树视图控件 xamarin 表单中

Treeview ContainerFromItem 总是返回 null

动态数据绑定之监听对象变化

将子项和父项的平展列表到树视图层次结构

将对象列表数据绑定到 WinForms DataGridView,但不显示某些公共属性

如何包装到树中的单个对象?