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 数据绑定混合类型的分层数据 的相关文章

随机推荐

  • 为什么没有调用 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