C# WPF TreeView如何为TreeViewItem的子元素添加TreeViewItem控件模板

C# WPF TreeView如何为TreeViewItem的子元素添加TreeViewItem控件模板,c#,wpf,mvvm,treeview,treeviewitem,C#,Wpf,Mvvm,Treeview,Treeviewitem,如何创建这样的树视图: <TreeViewItem Header="Customers" ItemsSource="{Binding Customers}"> 顾客 安娜 删除 打开 彼得 删除 打开 安德鲁 删除 打开 我想创建类似这样的子项模板 <TreeViewItem Header="{Binding Header}"> <TreeViewItem Header="Delete"/> <TreeViewI

如何创建这样的树视图:

 <TreeViewItem Header="Customers" ItemsSource="{Binding Customers}">

  • 顾客
    • 安娜
      • 删除
      • 打开
    • 彼得
      • 删除
      • 打开
    • 安德鲁
      • 删除
      • 打开
我想创建类似这样的子项模板

 <TreeViewItem Header="{Binding Header}">
   <TreeViewItem Header="Delete"/>
   <TreeViewItem Header="Open"/>
 </TreeViewItem>

但它并没有很好地工作,因为我最终使用了带有datatemplate treeviewitem的treeviewitem,但我希望覆盖子元素的controltemplate,而不是父元素。 当然,我想避免绑定到TreeView项目,也不想用那些静态obejct“Open”、“Delete”创建子项。

是我读过的关于
TreeView
的最好的文章之一

TreeView.Resources
中,如果Delete和Open命令是某个集合的项,则可以使用不同的
数据类型声明多个数据模板。(命令的TargetType为ICommand)

但是看起来你根本不需要TreeView。 客户是列表的标题。如果希望它是可扩展的,请使用控件。
然后,为每个客户提供一个数据模板就足够了

<DataTemplate DataType="CustomerTypeName">
    <Expander Header="{Binding CustomerName}">
        <Button Command="{Binding DeleteCustomerCmd}" Content="Delete" Margin="15,0,0,0"/>
        <Button Command="{Binding OpenCustomerCmd}" Content="Open" Margin="15,0,0,0"/>
    <Expander/>
<DataTemplate>
是我读过的关于
TreeView
的最好的文章之一

TreeView.Resources
中,如果Delete和Open命令是某个集合的项,则可以使用不同的
数据类型声明多个数据模板。(命令的TargetType为ICommand)

但是看起来你根本不需要TreeView。 客户是列表的标题。如果希望它是可扩展的,请使用控件。
然后,为每个客户提供一个数据模板就足够了

<DataTemplate DataType="CustomerTypeName">
    <Expander Header="{Binding CustomerName}">
        <Button Command="{Binding DeleteCustomerCmd}" Content="Delete" Margin="15,0,0,0"/>
        <Button Command="{Binding OpenCustomerCmd}" Content="Open" Margin="15,0,0,0"/>
    <Expander/>
<DataTemplate>


删除和打开只是操作吗?是的,所有树项目都是常量,所以我想在XAML中构建它们。这就是为什么我想使用TreeView作为数据模板(这显然是错误的,但你们明白我的想法)你们真的需要使用TreeView还是仅仅想要类似的项目安排?这是现有的设计使用TreeView。但在现有的设计中,这些节点是在代码隐藏中构造的。这是一件令人讨厌的事。我希望改进静态子项并将其移动到XAML,而不是在代码隐藏中使用TreeView项填充TreeView,然后使用字符串比较来确定单击了哪个项!;)删除和打开只是操作吗?是的,所有树项目都是常量,所以我想在XAML中构建它们。这就是为什么我想使用TreeView作为数据模板(这显然是错误的,但你们明白我的想法)你们真的需要使用TreeView还是仅仅想要类似的项目安排?这是现有的设计使用TreeView。但在现有的设计中,这些节点是在代码隐藏中构造的。这是一件令人讨厌的事。我希望改进静态子项并将其移动到XAML,而不是在代码隐藏中使用TreeView项填充TreeView,然后使用字符串比较来确定单击了哪个项!;)我需要将其放在树状视图中,因为客户在其他节点的更大树状视图中:/好的,我明白了。你还需要命令(删除和打开)成为树节点吗?我想是的,这样它们看起来和其他地方一样,设计也一样。如果它们是树节点,这并不重要,但如果它们是树节点,它们应该看起来与所有树相同(我猜),然后您应该为ViewModel中的命令创建一些包装器。我会添加一些代码。Thnx,我明白你的意思。那么你是在暗示我不能在TreeView中使用TreeView项目?使用setter来实现这一点怎么样?我需要将其放在树状视图中,因为客户在其他节点的更大树状视图中:/好的,我明白了。你还需要命令(删除和打开)成为树节点吗?我想是的,这样它们看起来和其他地方一样,设计也一样。如果它们是树节点,这并不重要,但如果它们是树节点,它们应该看起来与所有树相同(我猜),然后您应该为ViewModel中的命令创建一些包装器。我会添加一些代码。Thnx,我明白你的意思。那么你是在暗示我不能在TreeView中使用TreeView项目?使用setter来实现这一点怎么样?
<TreeView ItemsSource="{Binding ...}">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="TypeHoldingCustomersCollection" 
            ItemsSource="{Binding Customers}">
            <TextBlock Text="Customers"/>
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate DataType="CustomerViewModel" 
            ItemsSource="{Binding Commands}">
            <TextBlock Text="{Binding Path=Customer.Name}"/>
        </HierarchicalDataTemplate>

        <DataTemplate DataType="CommandWrapper">
            <Button Content="{Binding CommandName}" Command="{Binding Command}"/>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>