1

このようなツリービューを作成するにはどうすればよいですか:

 <TreeViewItem Header="Customers" ItemsSource="{Binding Customers}">
  • お客様
    • アンナ
      • 消去
      • 開ける
    • ピーター
      • 消去
      • 開ける
    • アンドリュー
      • 消去
      • 開ける

このような子アイテムテンプレートを作成したいと思います

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

しかし、datatemplate treeviewitem を持つ treeviewitem を持つことになるため、うまく機能しませんが、親ではなく子要素の controltemplate をオーバーライドしたいと考えています。確かに、バインディングが TreeViewItem になることは避けたいし、静的なオブジェクト "Open"、"Delete" を持つ子を作成したくもありません。

4

1 に答える 1

5

これは、私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>
于 2013-04-02T09:47:08.643 に答える