How do I set a DataTemplate for a WPF TreeView to display all Elements of an List?

前端 未结 3 1243
清歌不尽
清歌不尽 2020-12-20 22:15

I\'d like to visualize the following data structure using TreeViews in WPF:

class MyDataContext
{
    ICollectionView Outers {get;set;}
    //...
}

class Ou         


        
相关标签:
3条回答
  • 2020-12-20 22:42

    Please try to use HierarchicalDataTemplate with TreeView.

    HierarchicalDataTemplate

    0 讨论(0)
  • 2020-12-20 23:06

    Maybe this helps you a little bit ;)

    The xaml:

        <TreeView ItemsSource="{Binding Outers}">
            <TreeView.ItemTemplate>
                <DataTemplate>
                    <TreeViewItem ItemsSource="{Binding Actions}" Header="{Binding Name}">
                        <TreeViewItem.ItemTemplate>
                            <DataTemplate>
                                <Button Command="{Binding Click}" Content="{Binding Name}" />
                            </DataTemplate>
                        </TreeViewItem.ItemTemplate>
                    </TreeViewItem>
                </DataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    

    The data:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
    
            DataContext = new MyDataContext();
        }
    }
    
    
    
        class MyDataContext
        {
            public ObservableCollection<Outer> Outers { get; set; }
    
    
            public MyDataContext()
            {
                Outers = new ObservableCollection<Outer>();
                Outers.Add(new Outer() { Name = "Herp" });
                Outers.Add(new Outer() { Name = "Derp" });
            }
        }
    
        class Outer
        {
            public string Name { get; set; }
            public ObservableCollection<Inner> Actions { get; set; }
    
            public Outer()
            {
                Actions = new ObservableCollection<Inner>();
                Actions.Add(new Inner { Name = "Test1" });
                Actions.Add(new Inner { Name = "Test2" });
                Actions.Add(new Inner { Name = "Test3" });
                Actions.Add(new Inner { Name = "Test4" });
                Actions.Add(new Inner { Name = "Test5" });
                Actions.Add(new Inner { Name = "Test6" });
                Actions.Add(new Inner { Name = "Test7" });
            }
        }
    
    
        class Inner
        {
            public string Name { get; set; }
            public ICommand OnClick { get; set; }
        }
    

    And if you are using Commands... Try it with this example: ICommand

    0 讨论(0)
  • 2020-12-20 23:07

    I used the page Mateusz mentioned (HierarchicalDataTemplate) and after reading the answer to this question: Bind Collection to StackPanel I found a solution that did what I wanted:

    Here the players (level 3) are on the same row as the team (level 2):

    <TreeView ItemsSource="{Binding League}">
        <!-- Conference template -->
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Teams}">
                <TextBlock Foreground="Red" Text="{Binding Name}" />
                <!-- Team template -->
                <HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Name}"/>
                            <ItemsControl ItemsSource="{Binding Players}">
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <StackPanel Orientation="Horizontal">
                                        </StackPanel>
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                        <Button Content="{Binding }"/>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ItemsControl>
                        </StackPanel>
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
    

    the result

    0 讨论(0)
提交回复
热议问题