c# - 具有混合类型的 TreeView HierarchicalDataTemplate

标签 c# wpf treeview hierarchicaldatatemplate

我实际上正在开发我的第一个 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/

相关文章:

c# - 初始化从单一行为派生的对象的最佳方法是什么?

c# - 如何在无效登录后再次显示登录表单?

c# - 从上下文菜单发送对父对象的引用

javascript - 允许 HTML 的 angular-ivh-treeview 中的自定义标签

c# - 调试IIS随机疯狂内存使用情况

c# - 无法使用 MRTK v2.0.0-RC1 进行构建

WPF从其他线程访问GUI

wpf - 从 View 模型中选择数据网格行中的所有复选框

c# - 如何从绑定(bind)到 CollectionViewSource 的列表框中找到正确的项目

java - 如何通过代码初始化JavaFX fxml文件中定义的树形控件