WPF TreeView - 我的 ObservableCollection 应该是什么元素类型才能将它绑定到它的数据源?

WPF TreeView - what element type should my ObservableCollection be to bind it to its DataSource?

MVVM 风格。 Wihtout 过多地扰乱视图,最好是 - 不触及视图。

是否可以创建一个只包含嵌套项目的集合,而 TreeView 只显示它们?

我看过一个使用 MenuItem 作为数据类型的例子。如果我不想使用 MenuItem 怎么办?我假设,我的项目应该只实现一个定义它如何包含其他项目的接口。这是什么界面?

此外 - 我需要在每个项目上都有一个复选框,但这可能是提供项目模板的问题。

再一次,可以检查一个 MenuItem,这可能会有用 ;)

WPF(包括 ListBox 和 TreeView)中的 ItemsControl classes 的美妙之处在于项目源可以是您喜欢的任何类型的集合。没有理由必须是基于 UI 的 class - 事实上,对于模板,它可能永远不应该是。

然后设置 ItemTemplate 以定义 UI 为 ItemsSource 集合中的每个项目显示的内容。

例如

public class Person
{
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public List<Person> Children {get;} = new List<Person>();
}


public class MainViewModel
{
    public List<Person> PersonList {get;} = new List<Person>();
} 



<TreeView
    ItemsSource = {Binding PersonList} >
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate
            ItemsSource="{Binding Children}">
            <StackPanel>
                <Textblock Text={Binding FirstName} />
                <Textblock Text={Binding LastNameName} />
            </StackPanel>
        </HierarchicalDataTemplate>
    <TreeView.ItemTemplate>
</TreeView>

查看我的 blog post 以更深入地讨论如何在 MVVM 上下文中处理 TreeView 控件。