这TreeView
是我读过的最好的文章之一。
如果 Delete 和 Open 命令是某个集合的项目,则可以在内部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>
但是在这里你会遇到一些选择突出显示的问题。
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>