【问题标题】:Binding Dictionary<string,List<Class>> to multiple TreeViewItem将 Dictionary<string,List<Class>> 绑定到多个 TreeViewItem
【发布时间】:2018-01-30 22:15:18
【问题描述】:

所以我有一些数据要存储在树视图中,我让它与 2 个分支一起工作,但我坚持要获得更多。我认为字典最适合这种情况,因为当我添加“健全性检查”时,最容易将 ID 存储在密钥中

我希望我的数据如何呈现:

--Internet Checks
----- 'Date, message, status'
--------- 'Details'
--Server Checks
----- 'Date, message, status'
--------- 'Details'
--Sanity Checks
----- 'Date, message, status'
--------- 'Details'
--------- 'Error1'
--------- 'Error2'
--------- 'Error3'
--------- 'etc'
--etc

这就是它目前的样子

--Internet Checks
----- 'Date, message, status'
--Server Checks
----- 'Date, message, status'
--Sanity Checks
----- 'Date, message, status'
--etc

这就是我现在拥有我的 xaml 的方式:

<TreeView Name="treeView1" ItemsSource="{Binding Items}">
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Path=Value.SubItems}">
                        <TextBlock Text="{Binding Value.Text}" />
                        <HierarchicalDataTemplate.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=Value.Text}"/>
                            </DataTemplate>
                        </HierarchicalDataTemplate.ItemTemplate>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>

这是我的 MenuItem 类:

public class MenuItem
    {
        public MenuItem()
        {
            this.SubItems = new Dictionary<int, MenuItem>();
        }

        public Dictionary<int, MenuItem> SubItems { get; set; }

        public string Text { get; set; }
    }

这是我目前填写字典的方式:

public Dictionary<int, MenuItem> Fill(string name, Dictionary<int, MenuItem> root, List<HealthCheckHourModel> list)
        {
            root.Add(nextNum, new MenuItem { Text = name + " Checks"});
            foreach (HealthCheckHourModel hchm in list)
            {
                if (hchm.Message.Contains(name))
                {
                    root[nextNum].SubItems.Add(hchm.ID, new MenuItem { Text = hchm.StartTime + " " + hchm.Message });
                    root[nextNum].SubItems[hchm.ID].SubItems.Add(-111, new MenuItem { Text = hchm.Details });
                }
            }
            nextNum--;
            return root;
        }

【问题讨论】:

  • 你需要一个递归算法来获得三个级别。当前您的代码仅处理两个级别。

标签: c# wpf dictionary


【解决方案1】:

有两种可能:

  • 删除 HierarchicalDataTemplate 的 ItemTemplate。

    <TreeView Name="treeView1" ItemsSource="{Binding Items}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Path=Value.SubItems}">
                <TextBlock Text="{Binding Value.Text}" />
                <!--<HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Value.Text}"/>
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>-->
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
    
  • 为 HierarchicalDataTemplate 保留 ItemTemplate,但将 DataTemplate 替换为 HierarchicalDataTemplate

    <TreeView Name="treeView1" ItemsSource="{Binding Items}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Path=Value.SubItems}">
                <TextBlock Text="{Binding Value.Text}" />
                <HierarchicalDataTemplate.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Path=Value.SubItems}">
                        <TextBlock Text="{Binding Value.Text}" />
                    </HierarchicalDataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
    

【讨论】:

    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多