WPF Treeview 数据绑定混合类型的分层数据

2023-11-22

我的 WPF Treeview 绑定情况有点复杂。我在过去的两天里尝试用谷歌搜索它,并且this这是我想出的关闭方式,但这并不能解决问题。

情况如下:

我有一个看起来像这样的对象:

public class Category
{
  public string Name { get; set; }
  public List<Category> Categories { get; set; }
  public List<Product> Products { get; set; }
}

public class Product
{
  public string Name { get; set;
}

每个类别可以有一个对象列表和子类别。我这样做有一个对我和我正在编写的应用程序完全有意义的理由。

实际的对象构造可能看起来像这样:

Category - Pharmacy
  |-Product - Aspirin
  |-Product - Tylenol
  |-Category - Tooth Paste
  |  |-Product - Crest
  |  |-Product - Colgate
  |-Category - Paper Products
   |-Category - Toilet Paper
   |  |-Product - NoName
   |  |-Product - Charmin
   |-Category - Facial Tissue
      |-Product - Kleenex
Category - Household
  |-Product - Pinesol Cleaner
  |-Product - Garbage Bags

现在,我尝试将这种关系数据绑定到树视图。我希望 TreeView 看起来与上面的对象构造几乎相同。

到目前为止,我的 XAML Treeview 如下所示:

  <TreeView x:Name="CategoryList" Margin="8" Grid.Row="2" Grid.RowSpan="2" ItemsSource="{Binding Path=Categories}">
            <TreeView.Resources>
                <HierarchicalDataTemplate DataType="{x:Type src:Category}" ItemsSource="{Binding Products}">
                    <StackPanel>
                        <TextBlock Text="{Binding Path=Name}" />
                    </StackPanel>
                </HierarchicalDataTemplate>
                <HierarchicalDataTemplate DataType="{x:Type src:Product}">
                    <StackPanel>
                        <TextBlock Text="{Binding Path=Name}" />
                    </StackPanel>
                </HierarchicalDataTemplate>
            </TreeView.Resources>
        </TreeView>

这对于类别的主列表及其每个子产品非常有用。但它并没有更深入地显示每个类别下的子类别。

有没有办法直接使用模板来执行此操作,以便选择每个项目(类别或产品)?我正在使用 MVVM 模式,并且不想诉诸使用后面的代码,但如果有必要的话会这样做。


由于您希望 TreeView 中的元素具有由类别产品组成的子级列表,因此您将希望类别视图模型具有由类别和产品组成的集合。例如,您可以使用复合集合合并您现有的集合:

public class Category
{
    public string Name { get; set; }
    public List<Category> Categories { get; set; }
    public List<Product> Products { get; set; }

    public IList Children
    {
        get
        {
            return new CompositeCollection()
            {
                new CollectionContainer() { Collection = Products },
                new CollectionContainer() { Collection = Categories }
            };
        }
    }
}

(在实际代码中,您可能希望保留对同一集合对象的引用,而不是每次都创建一个新集合对象。)

然后在 HierarchicalDataTemplate 中,使用组合列表作为 ItemsSource:

<HierarchicalDataTemplate DataType="{x:Type src:Category}"
                          ItemsSource="{Binding Children}">

这些项目将是 Product 和 Category 对象的混合,WPF 将为每个项目使用适当的 DataTemplate。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF Treeview 数据绑定混合类型的分层数据 的相关文章

  • 如何使树视图不可折叠?

    使用WinForms中的TreeView控件 是否有一个属性可以设置为隐藏每个节点的折叠节点图标 另外 如何永久展开 TreeView 中的所有节点 你需要处理OnBeforeExpand事件和设置Cancel to true privat
  • WPF;单击 ListView 中的空白区域时如何取消选择所有选定的项目

    当我有几个 甚至一个 selected items我按简单click在我的空白处ListView 空白 非行 我想取消选择所有选定的项目 这是我取消选择所有项目的功能 private void DeselectAllListViewItem
  • WPF 组合框如果只有 1 项则自动选择

    我有一个组合框 我绑定到一个可观察的集合 它会发生变化 根据选择的公司 并且大量公司将有一个帐户 项目 因此我想知道制作组合框的最佳方法是什么如果 ItemsSource 中只有 1 个项目 则设置 SelectedItem 否则将其保留为
  • TargetType="controlType" 和 TargetType="{x:Type controlType}" 之间的区别

    在 WPF 中 您可以设置TargetType类型的名称 或者您可以将其设置为 x Type nameOfType 有谁知道有什么区别 没有什么 由于属性类型是Type XAML 解析器知道尝试将您提供的任何内容转换为Type 在其他情况下
  • 即使在 GC Collect 和 WaitForPendingFinalizers 之后,窗口对象在关闭后也未释放?

    这是一个简单的测试应用程序 可帮助了解 WPF 内存使用情况 我想了解的关键是为什么MainWindow即使在关闭并等待 GC 完成之后 仍然被引用并且它的内存没有被释放 参见下面的代码清单 文本 MainWindow Finalizer
  • 重写 WPF 工具包图表中的 DataPointStyle

    我想覆盖DataPointStyle of the LineSeries在我的 WPF 工具包中Chart
  • 无法使用 DialogResult

    我尝试使用DialogResult检查一个Messagebox s 是 否 取消 我正在使用以下代码 我没有看到任何问题 DialogResult dlgResult MessageBox Show Save changes before
  • WPF HierarchicalDataTemplate 不会在属性更改时更新 ItemsSource

    这是一些 XAML
  • 分层查询

    我希望我能够解释困扰我的问题 我有以下分层数据集 这只是 34K 记录的子集 PARENT ID CHILD ID EXAM TUDA12802 TUDA12982 N TUDA12982 TUDA12984 J TUDA12984 TUD
  • 比较运算符性能 <= 与 !=

    让我们首先声明代码可读性胜过微优化 我们应该将其留给编译器 这只是一个奇怪的案例 具体细节似乎与一般建议相比很有趣 因此 我在搞素数生成器函数 并提出了一种奇怪的行为 其中 人们建议效率最高 实际上效率最低 而 C private stat
  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • Wpf TextBlock 中的垂直文本

    是否可以垂直显示 TextBlock 中的文本 以便所有字母彼此堆叠 不使用 LayoutTransform 旋转 还没有人提到使用纯 XAML 垂直堆叠任意字符串的字母 不旋转它们 的明显而简单的方法
  • 如何? WPF 窗口 - 最大化,不调整大小/移动

    我正在尝试创建一个已最大化打开的 WPF 窗口 无需调整大小 移动 在系统菜单中 也不在边框中 它应该一直最大化 除非用户最小化它 我尝试将 WindowState Maximized 和 ResizeMode CanMinimize 放在
  • WPF 处理文本、图像和文件粘贴事件

    我正在开发一个 WPF 应用程序 我想捕获 RichTextBox 输入中的粘贴命令并处理粘贴的文件 为此 我使用以下回调
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 需要“依赖属性”的简短而清晰的定义

    我试图弄清楚依赖属性到底是什么 但是当我在任何地方寻找定义时 我只找到 如何使用 而不是 它是什么 想象一下 您在面试时被问到 什么是依赖属性 你的答案是什么 DependencyProperty 是一个属性 其值取决于 或可以取决于 某些
  • 给图像着色[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试着色System Windows Controls Image 该图像包含透明区域 我只是想用颜色给非透明区域着色 例如 图
  • WPF控件默认大小

    为 wpf 应用程序定义自定义资源主题时 我可以设置宽度 高度等 如何找到这些属性的默认值 即框架中提供的控件中使用的值 WPF 控件通常不包含任何类型的默认大小 WPF 的主要功能点之一是 除非您指定大小 否则所有内容都会动态调整大小 如
  • 如何以编程方式调用应用程序菜单?

    我有自定义样式的非矩形透明窗口

随机推荐

  • 为什么没有调用 AccountAuthenticator#getAuthToken() ?

    我通过扩展创建了自己的 Android 帐户身份验证器AbstractAccountAuthenticator并实施addAccount and getAuthToken 其中的一些方法被调用AccountManager 但其他人则不然 这
  • 从头开始构建 Eclipse IDE - 制作更大的图标有时会成功

    Even the newest Eclipse Neon edition has still somewhat small icons on a 4k display That is why I m trying to make them
  • 如何在 ASP.NET 中全局设置日期格式?

    如何在 ASP NET 中全局设置日期格式 我的本地计算机和服务器的区域设置设置为 英语 新西兰 当我格式化日期时dd MM yyyy我期待看到19 11 2008以今天为例 直到最近 这实际上是我从本地计算机和服务器上获得的 就在最近 由
  • 如何使用 Spring Security hasRole 常量

    我有一个带有 Spring Security 的 JSP 我有一个简单的标签来确定用户是否有ADMIN像这样的角色
  • PyBrain:如何在神经网络中放置特定的权重?

    我试图根据给定的事实重新创建一个神经网络 它有 3 个输入 一个隐藏层和一个输出 我的问题是权重也给定了 所以我不需要训练 我在想也许我可以保存类似结构神经网络的训练并相应地改变值 你认为这会起作用吗 还有其他想法吗 谢谢 神经网络代码 n
  • Android 耳机插孔监听器

    有谁知道如何在 Android 上检测设备上的耳机插孔是否已拔出 我有一个音乐播放器 当拔掉耳机时我需要暂停音乐 我发现的最接近的东西是使用AudioManager 这是正确的方向吗 这就是我最终所做的 private class Nois
  • 强制粘贴事件以 Base64 编码图像

    背景 我正在为我的公司开发一个 HTML5 Web 应用程序 它基本上是一个将信息存储在数据库中的富文本编辑器 类似于 Google 文档 我们使用 CKEditor 3 作为富文本编辑器和 Jquery 来完成此任务 我们选择 Googl
  • Thymeleaf:可点击的行

    我想在 html thymeleaf 中生成可点击的表格行 但我有以下问题 AFAIK 它无法用链接 a 标签 包装 tr 元素 因为表只能 直接包含 tr 子标签 所以我必须包装每个 td tag 的内容 但这些值是由 thymeleaf
  • 单击 Windows 窗体中 CefSharp 浏览器中的按钮

    我正在尝试单击网页 kahoot it 上的按钮 并且我已经知道我可能需要使用 Javascript 来实现这一点 只要它保留 1 行 JavaScript 因为这很容易在WinForms 我没有太多关于按钮的信息 仅有的
  • 使用 htaccess 阻止特定目录的所有机器人/爬虫/蜘蛛

    我正在尝试阻止特殊目录的所有机器人 爬虫 蜘蛛 我怎样才能做到这一点htaccess 我搜索了一下 找到了基于用户代理阻塞的解决方案 RewriteCond HTTP USER AGENT googlebot 现在我需要更多的用户代理 对于
  • 从 Rails 表单获取数组

    我需要设计一个表格account资源 在这种形式下 我需要收集一些 id 集作为数组params属性中的哈希值称为relationships 所以最后的params account POST 请求的哈希值应类似于 name gt somen
  • 嵌套垂直边距折叠如何工作?

    我很难理解嵌套元素中垂直边距折叠的概念 我来了一篇文章http www howtocreate co uk tutorials css margincollapsing解释它是如何工作的 但是我对其解释感到困惑 所以在它的例子中它引用了以下
  • Rails:使用多个条件连接

    我有一个简单的模型 例如 class Interest lt ActiveRecord Base has and belongs to many user profiles end class UserProfile lt ActiveRe
  • 类中 static const ODR

    我有点困惑statica 的类内初始化const成员 例如 在下面的代码中 include
  • 将 jQuery UI Accordion 放入 jQuery UI 对话框中

    通过为选项卡创建适当的标记 我已经能够将 jQuery UI 选项卡小部件放置在 jQuery UI 对话框中 但对手风琴进行同样的操作并不起作用 单击手风琴部分的锚点会导致对话框关闭 有没有一种简单的方法可以实现这一点 对我来说效果很好
  • 查找某个项目是否在 JavaScript 数组中的最佳方法? [复制]

    这个问题在这里已经有答案了 查找对象是否在数组中的最佳方法是什么 这是我所知道的最好的方法 function include arr obj for var i 0 i lt arr length i if arr i obj return
  • C# delegate 只写出最后一个方法

    我有这个代码 public void myMethod int a 10 int b 20 Func
  • 如何使用 .htaccess 重写将根 URL 重定向到子目录?

    试图得到 www example com 直接去 www example com store 我尝试了多段代码 但没有任何效果 我尝试过的 Options FollowSymlinks RewriteEngine on RewriteCon
  • Rails:在登录或注册后设计重定向到存储位置?

    我正在编写的 Rails 应用程序中使用 Devise 我想让用户在登录或注册后返回到他们所在的位置 例如 如果我有一个受以下保护的 评论 控制器 before filter authenticate user 然后我希望用户点击 立即评论
  • WPF Treeview 数据绑定混合类型的分层数据

    我的 WPF Treeview 绑定情况有点复杂 我在过去的两天里尝试用谷歌搜索它 并且this这是我想出的关闭方式 但这并不能解决问题 情况如下 我有一个看起来像这样的对象 public class Category public str