我实际上正在开发我的第一个 WPF 应用程序,它必须在具有分层数据的 TreeView 中显示计算机的所有组件。
从昨天开始,我遇到了一个小问题,我阅读了大量的 TreeView 绑定(bind)示例,但我没有成功地进行多种类型绑定(bind)...
它必须看起来像这样:
我的机器(0级)
-----键盘⬇️(1级)
--------键盘1⬇️(2级)
--------键盘2⬇️(2级)
-----操作系统⬇️(级别1)
-----CPU⬇️(级别1)
--------CPU1⬇️(级别2)
--------CPU2⬇️(级别2)
-----VideoCard⬇️(级别1)
---------VideoCard1⬇️(级别 2)
---------VideoCard2⬇️(级别 2)
我有一个包含所有组件设备的 View 模型:
DeviceInfo.cs:
public class DeviceInfo
{
public string ComputerName { get; set; }
public Bios Bios { get; set; }
public ComputerSystem ComputerSystem { get; set; }
public List<Keyboard> Keyboards { get; set; }
public OperatingSystem OperatingSystem { get; set; }
public List<Processor> Processors { get; set; }
public List<VideoCard> VideoCards { get; set; }
}
每个组件都包含特定的属性,例如Keyboard.cs:
public class Keyboard
{
public string Description { get; set; }
public string DeviceID { get; set; }
}
我为我的 TreeView 尝试了类似的方法,我在主窗口中绑定(bind)数据,如下所示:
DeviceTree.ItemsSource = deviceInfos;
MainWindow.xaml:
<TreeView Margin="10" BorderThickness="2" BorderBrush="Black" Name="DeviceTree">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="x:Type data:DeviceInfo" ItemsSource="{Binding Keyboards}">
<TextBlock Text="{Binding Description}"></TextBlock>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="x:Type data:DeviceInfo" ItemsSource="{Binding OS}">
<TextBlock Text="{Binding Version}"></TextBlock>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="x:Type data:DeviceInfo" ItemsSource="{Binding VideoCard}">
<TextBlock Text="{Binding SerialNumber}"></TextBlock>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
实际上它在我的 TreeView 模板中看起来像这样:
“型号.设备信息”
类似示例的每个链接都会对我有帮助。 提前致谢
最佳答案
一个HierarchicalDataTemplate
仅支持单个子属性。为同一类型定义三个模板是没有意义的。无论如何,只有其中一个可以在运行时应用。
你应该做的是改变你的DeviceInfo
类转换为具有单个子属性的数据绑定(bind)友好 View 模型类:
public class Item
{
public string Header { get; set; }
public IEnumerable<Item> Children { get; set; }
}
然后您将绑定(bind) ItemsSource
属性(property)IEnumerable<Item>
四个 Item
根对象,即 1 级键盘、操作系统、CPU 和视频卡节点。
另请注意设置 DataType
的语法XAML 中实际类型的属性:
<TreeView Margin="10" BorderThickness="2" BorderBrush="Black" Name="DeviceTree">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Item}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Header}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
编辑:
如果级别总数不是动态的,即总共有两个级别,则可以设置或绑定(bind) ItemsSource
属性(property)new List<DeviceInfo>(1) { deviceInfos }
并将“静态”根级别添加到 TreeView
明确地在您的 XAML 标记中:
<TreeView Margin="10" BorderThickness="2" BorderBrush="Black" Name="DeviceTree">
<TreeViewItem Header="Keyboards" ItemsSource="{Binding Keyboards}">
<TreeViewItem.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Description}" />
</DataTemplate>
</TreeViewItem.ItemTemplate>
</TreeViewItem>
<TreeViewItem Header="Operating Systems" ItemsSource="{Binding OperatingSystem}">
<TreeViewItem.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Version}" />
</DataTemplate>
</TreeViewItem.ItemTemplate>
</TreeViewItem>
<!-- + TreeViewItems for Processors and VideoCards -->
</TreeView>
关于c# - 具有混合类型的 TreeView HierarchicalDataTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56951864/