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

0xD*_*EEF 1 c# wpf treeview mvvm treeviewitem

我如何创建这样的树视图:

 <TreeViewItem Header="Customers" ItemsSource="{Binding Customers}">
Run Code Online (Sandbox Code Playgroud)
  • 顾客
    • 安娜
      • 删除
      • 打开
    • 彼得
      • 删除
      • 打开
    • 安德鲁
      • 删除
      • 打开

我想创建这样的子项模板

 <TreeViewItem Header="{Binding Header}">
   <TreeViewItem Header="Delete"/>
   <TreeViewItem Header="Open"/>
 </TreeViewItem>
Run Code Online (Sandbox Code Playgroud)

但它并不能很好地工作,因为我最终拥有带有数据模板 treeviewitem 的 treeviewitem,但我想覆盖子元素的 controltemplate,而不是父元素。当然,我想避免我的绑定成为 TreeViewItem,也不想用那些静态对象“打开”、“删除”创建子对象。

Pav*_*nin 5

TreeView我读过的最好的文章之一。

如果删除和打开命令是某个集合的项目,则在内部TreeView.Resources您可以声明多个不同的 DataTemplates DataType。(命令的 TargetType 将是 ICommand)。

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

<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>
Run Code Online (Sandbox Code Playgroud)

但是在这里您会遇到选择突出显示的一些麻烦。

public class CommandWrapper
{
    ICommand Command {get;set;}
    string CommandName {get;set;}
}

public class CustomerViewModel
{
    Customer Customer {get;set;}
    IEnumerable<CommandWrapper> Commands {get;}
}
Run Code Online (Sandbox Code Playgroud)

让客户成为收藏CustomerViewModel。那么以下 XAML 可以提供帮助:

<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>
Run Code Online (Sandbox Code Playgroud)