简体   繁体   English

如何为WPF TreeView设置DataTemplate以显示列表的所有元素?

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

I'd like to visualize the following data structure using TreeViews in WPF: 我想在WPF中使用TreeViews可视化以下数据结构:

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

class Outer
{
    string Name {get;set;}
    IEnumberable<Inner> Actions {get;set;} 
}


class Inner
{
    string Description {get;set;}
    Command OnClick {get;set;}
}

This is my attempt so far: 这是我到目前为止的尝试:

<!-- DataContext is MyDataContext at this  point -->
<TreeView ItemsSource="{Binding Path=Outers}">
    <TreeView.Resources>
        <DataTemplate DataType="{x:Type myns:Outer}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Path=Name}"/>

                <TreeView ItemsSource="{Binding Path=Actions}" >
                    <DataTemplate DataType="{x:Type myns:Inner}">
                        <Button Command={Binding Path=OnClick}>
                            <TextBlock Text="{Binding Path=Description}"/>
                        </Button>
                    </DataTemplate>
                </TreeView>
            </StackPanel>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>

It seams like there's something wrong with this access since I get the following InvalidOperationException : 由于我得到以下InvalidOperationException ,因此访问此类访问有问题:

Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead.

If I drop the inner TreeView there's no exception (but also no buttons of course). 如果我删除内部TreeView,则没有异常(当然也没有按钮)。

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: 我使用了Mateusz提到的页面( HierarchicalDataTemplate ),在阅读了这个问题的答案之后:将Collection绑定到StackPanel我发现了一个能够达到我想要的解决方案:

Here the players (level 3) are on the same row as the team (level 2): 这里的球员(3级)和球队在同一排(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>

结果

Please try to use HierarchicalDataTemplate with TreeView. 请尝试将HierarchicalDataTemplate与TreeView一起使用。

HierarchicalDataTemplate HierarchicalDataTemplate

Maybe this helps you a little bit ;) 也许这会对你有所帮助;)

The xaml: 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 如果您正在使用命令...请尝试使用此示例: ICommand

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在树视图的代码中设置WPF datatemplate? - How to setup a WPF datatemplate in code for a treeview? WPF TreeView DataTemplate触发器 - WPF TreeView DataTemplate Triggers TreeView 中的 WPF Heirachical DataTemplate - WPF Heirachical DataTemplate in TreeView WPF树视图数据模板 - WPF treeview datatemplate 如何访问 WPF 代码隐藏中 ContentControl DataTemplate 中的 object,或者如何在 xaml 中设置 CefSharp DownloadHandler - How can I access an object that is in a ContentControl DataTemplate in WPF codebehind, or how do I set a CefSharp DownloadHandler in xaml 如何为TreeView中的某些节点而不是所有节点设置图像? - How do I set an image for some but not all nodes in a TreeView? 当元素位于DataTemplate中时,如何在WPF中生成多个计时器? - How can I generate multiple timers in WPF when elements are in a DataTemplate? 在WPF中,当EventTrigger Source在页面资源之外但Storyboard.TargetName在树视图数据模板中时,该怎么办? - In WPF, how to do when EventTrigger Source is outside a page's resources but Storyboard.TargetName is in a treeview datatemplate? 如何将 ObservableConcurrentDictionary 绑定到 WPF TreeView - How do I bind an ObservableConcurrentDictionary to WPF TreeView WPF TreeView:如何为所有树元素添加触发器 - WPF TreeView: how to add a trigger for all tree elements
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM