如何将对象及其属性绑定到树视图
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<Device> devices get;set;
编辑:我不知道如何使用树视图,因为我从不需要它。但是您可以通过几次调整绑定来实现您的目标。
这行代码看起来不对<HierarchicalDataTemplate ItemsSource="Binding Device">
,因为没有名为“设备”的属性
【讨论】:
像PropertyChanged = (sender, e) =>
这样的空事件处理程序会减慢足够大的应用程序。 PropertyChanged?.Invoke()
是首选
感谢您的帮助。但我在我的项目的其他地方处理了这个属性更改。
@DerHelm 您无法绑定到字段。你知道吗?如果您在项目中的课程与您在此处发布的完全一样。它不会工作以上是关于如何将对象及其属性绑定到树视图的主要内容,如果未能解决你的问题,请参考以下文章
Treeview ContainerFromItem 总是返回 null