私は、これは古い質問ですけど、私にはまだ関連しました。
私の場合、正確に2つのレイヤーが必要なので、TreeView
はカットしないと思っていました。表示されるアイテムのタイプは2つのレイヤーによって異なります。また、私はExpander
のリストをリファクタリングしていますので、私は一次元的に考えていました。
しかし、私はあなたがHierarchicalDataTemplate
あなた自身を含めることTreeView
のItemTemplate
をカスタマイズし、あなた自身でそのHierarchicalDataTemplate
のItemTemplate
がDataTemplate
...プレストを合わせてカスタマイズできることができることを実現しました!正確に2つのレイヤーは、それぞれに異なるものがあります!
私の指摘は、TreeView
は独自のカスタムコントロールを作成しないように十分な柔軟性があるということです。ここで
は、私がやったことだ:
XAML:
<Page x:Class="Foo.Views.TreePage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Foo.Views"
xmlns:viewModel="clr-namespace:Foo.ViewModels"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
Title="Tree page"
d:DataContext="{d:DesignInstance Type=viewModel:TreeModel}">
<TreeView
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"
ScrollViewer.CanContentScroll="True"
VirtualizingPanel.ScrollUnit="Pixel"
ItemsSource="{Binding Values}"><!-- IList<Person> -->
<TreeView.ItemTemplate><!-- Template for first layer, which has a HierarchicalDataTemplate so that this layer will expand -->
<HierarchicalDataTemplate
ItemsSource="{Binding Expenses}"><!-- IList<Expense> -->
<HierarchicalDataTemplate.ItemTemplate><!-- Template for the second layer, which has a DataTemplate instead of HierarchicalDataTemplate so that this layer won't expand -->
<DataTemplate>
<TextBlock Text="{Binding Amount}"/><!-- Expense amount in dollars -->
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
<TextBlock Text="{Binding Name}"/><!-- Person name -->
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Page>
Person
クラス:
public class Person
{
public string Name { get; set; }
public List<Expense> Expenses { get; set; }
}
Expense
クラス:
public class Expense
{
public double Amount { get; set; }
}
ここで方法ですそれが見えます:
私はそれがUIの仮想化であることを証明するためにSnoopでそれを点検しました。ここでアプリが小さいときにロードされたTreeViewItem
秒の数です:
...そして、ここでアプリが(それがこのスニペットを超えていっているフルスクリーン時にロードさTreeViewItem
秒の数ですが、あなたが得ますアイデア):
今では私が望むどのようにネストされたレイヤーの外観を作るためにスタイリング物事の単純な問題です!
編集:TreeView
は、最初のレイヤーだけでなく、すべてのレイヤーを仮想化することを確認しました。
私はそれがしばらくしていることを知っていますが、あなたはこれを回避するために何をしたのでしょうか? –
私はちょうど[Davidのアカウントはしばらくの間非アクティブになっていることに気づきました](http://stackoverflow.com/users/17784/david-hay?post-filters=All&post-sorts=Newest)。だから私の後ろに来る人のために[[私の答えを参照してください](http://stackoverflow.com/a/42842476/3063273) –