使用动态上下文菜单C#WPF创建自定义树视图

问题描述 投票:0回答:2

我想从C#WPF中的列表创建动态树视图。因此,我将从列表中获取所有队列(queue1,...)和主题(topic1,...)。此外,我需要针对不同层次结构点的特定上下文菜单。我想创建一个像这样的树形视图:

队列

  • queue1
  • queue2

主题

  • topic1
  • topic2

应该有针对重点队列的特定上下文菜单和针对重点主题的特定菜单。另外,我需要一个专门用于子项queues1和topic1的项目。我尝试了一些尝试,但没有成功。有没有人举一个小例子来说明谁可以解决这个问题?

最佳问候

c# .net wpf tree treeview
2个回答
1
投票

创建树不是问题。它涉及一些工作,但很简单。您必须从列表中创建分层数据模板,然后填充树。以下链接具有所有信息。

Creating a wpf tree

或者,如果您不想使用SDK的话

页面资源:

xaml中的树:

<Grid TextElement.FontSize="10" DataContext="{StaticResource MyHierarchicalViewSource}" >
<GroupBox x:Name="gbTree">
<TreeView Name="HierarchyTreeview" HorizontalAlignment="Left" AllowDrop="True"
          BorderThickness="0" VerticalAlignment="Top" Height="Auto" 
                              ItemsSource="{Binding}">
 <TreeView.ItemTemplate>
   <HierarchicalDataTemplate ItemsSource="{Binding Itemchildren, Mode=TwoWay}">
      <StackPanel Orientation="Horizontal" Margin="2">

        <TextBlock x:Name="text" Text="{Binding Item.ItemLabel}" >
        </TextBlock>

     </StackPanel>
     </HierarchicalDataTemplate>
   </TreeView.ItemTemplate>
  </TreeView> 
 </GroupBox>
</Grid>

代码行为:

    Me._HierarchyViewSource = CType(Me.Resources("MyHierarchicalViewSource"), System.Windows.Data.CollectionViewSource)
Me._HierarchyViewSource.Source = your hierarchical data collection

假设您的层次结构类结构:

Item has
 ItemChildren collection

但是,在创建特定的上下文菜单时,我遇到相同的问题。我已经发布了我自己的问题,还没有找到解决方案。我试图用数据触发器来做到这一点,但没有运气。我知道的唯一方法是为整个树创建上下文菜单,并根据项目类型使它可见或不可见。

如果找到解决方法,我将发布。


0
投票

我使用以下代码动态添加到TreeView。

CategorieList-具有ID,名称,布尔值作为父类别的IsSubCategory和Id的类别的集合。

private void AddToTree()
        {
            List<Category> topCategory = CategorieList.Where(c => c.IsSubCategory == false).ToList();

            foreach(Category c in topCategory)
            {
                CategoryTree.Items.Add(CreateTreeViewItem(c));
            }
        }

    private TreeViewItem CreateTreeViewItem(Category category)
    {
        TreeViewItem tItem = new TreeViewItem();
        tItem.Header = category.Name;
        List<Category> sub = CategorieList.Where(c => category.Id == c.ParentCategory).ToList();
        if (null != sub && sub.Count() != 0)
        {
            foreach (Category c in sub)
            {
                TreeViewItem item = CreateTreeViewItem(c);
                tItem.Items.Add(item);
            }
        }

        return tItem;
    }

下面是XAML代码

<TreeView x:Name="CategoryTree"> </TreeView>
© www.soinside.com 2019 - 2024. All rights reserved.