これは、私TreeView
が今まで読んだ中で最高の記事の 1 つです。
内部で、Delete コマンドと Open コマンドがコレクションのアイテムである場合、TreeView.Resources
複数の DataTemplates を異なるものとして宣言できます。DataType
(コマンドの TargetType は ICommand になります)。
しかし、TreeView はまったく必要ないようです。Customers はリストのヘッダーです。展開可能にしたい場合は、エキスパンダーコントロールを使用します。
その場合、顧客ごとに 1 つのデータ テンプレートを提供するだけで十分です。
<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;}
}
Customers を のコレクションとし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>