我如何创建像这样的treeview:
<TreeViewItem Header="Customers" ItemsSource="{Binding Customers}">
我想创建像这样的子项目模板
<TreeViewItem Header="{Binding Header}">
<TreeViewItem Header="Delete"/>
<TreeViewItem Header="Open"/>
</TreeViewItem>
但这并不能很好地起作用,因为我最终将treeviewitem与datatemplate treeviewitem一起使用,但是我想覆盖子元素而不是父元素的controltemplate。
当然,我想避免绑定(bind)为TreeViewItem,也不想使用静态对象“Open”,“Delete”创建子代。
最佳答案
Here是我读过的有关TreeView
的最佳文章之一。
如果Delete和Open命令是某个集合的项目,则可以在TreeView.Resources
内部声明多个具有不同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>
但是在这里,选择突出显示会有些麻烦。
public class CommandWrapper
{
ICommand Command {get;set;}
string CommandName {get;set;}
}
public class CustomerViewModel
{
Customer Customer {get;set;}
IEnumerable<CommandWrapper> Commands {get;}
}
让客户成为
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>
关于c# - WPF TreeView如何为TreeViewItem的子元素添加TreeViewItem控件模板,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15704761/