2016-06-26 2 views
0

следущие моделиМОФ TreeView DataTemplate - заменить элемент с деревом

class Storage 
{ 
    public List<Stored> StoredItems { get; } 
} 

class Stored 
{ 
    public string Name { get; set; } 
    public List<File> Files { get; } = new List<File>(); 
} 

class File 
{ 
    public string Name { get; set; } 
    public Tree Schema { get; set; } 
} 

class Tree 
{ 
    public string Label { get; set; } 
    public List<Tree> Children { get; set; } = new List<Tree>(); 
} 

Я хотел бы, чтобы отобразить Storage в TreeView следующим образом:

StoredItem1.Name 
    File1.Schema.Label 
    File1.Schema.Children[0].Label 
    File1.Schema.Children[1].Label 
     File1.Schema.Children[1].Children.Label 
    File2.Schema.Label 
StoredItem2.Name 

т.е. отобразить все Stored S, которые содержат Schema каждого файл, который является рекурсивным.

Я не уверен, как достичь этого, моя главная проблема заключается в том, как получить Schema для отображения. Когда я сменил мою модель на обертку Schema в одном списке, она начала работать, но я бы хотел, чтобы она не загрязняла мою модель, но я все же не хочу отображать имя файла, а не отображать его схему.

Еще одна вещь, которую я хотел бы иметь, имеет свойство SelectedStoredItem в моей модели и привязывает его, ну, выбрано Stored item. Он может быть нулевым, если, например, выбран какой-либо узел схемы или он равен Stored, к которому принадлежит выбранный узел, но я предпочитаю первый вариант.

Вот мой xaml, он не делает то, что я хочу, просто отображает Stored элементов и их имена файлов.

<Window x:Class="TreeViewTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:TreeViewTest" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.DataContext> 
     <local:Storage/> 
    </Window.DataContext> 
    <Grid> 
     <TreeView 
       ItemsSource="{Binding StoredItems}"> 
      <TreeView.Resources> 
       <HierarchicalDataTemplate DataType="{x:Type local:Stored}" 
              ItemsSource="{Binding Files}"> 
        <TextBlock Text="{Binding Name}"/> 
       </HierarchicalDataTemplate> 
       <HierarchicalDataTemplate DataType="{x:Type local:File}" 
              ItemsSource="{Binding Schema}"> 
        <TextBlock Text="{Binding Name}"/> 
       </HierarchicalDataTemplate> 
       <HierarchicalDataTemplate DataType="{x:Type local:Tree}" 
              ItemsSource="{Binding Children}"> 
        <TextBlock Text="{Binding Label}"/> 
       </HierarchicalDataTemplate> 
      </TreeView.Resources> 
     </TreeView> 
    </Grid> 
</Window> 

и вот полный код позади

namespace TreeViewTest 
{ 
    public partial class MainWindow 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 
    } 

    class Storage 
    { 
     public Storage() 
     { 
      StoredItems = new List<Stored>(); 
      var a1 = new Stored {Name = "Stored1"}; 
      a1.Files.Add(new File 
      { 
       Name = "File1", 
       Schema = new Tree 
       { 
        Label = "1_1", 
        Children = new List<Tree> { new Tree { Label = "1_1_1" } } 
       } 
      }); 
      a1.Files.Add(new File 
      { 
       Name = "File2", 
       Schema = new Tree 
       { 
        Label = "2_1", 
        Children = new List<Tree> { new Tree { Label = "2_1_1" }, new Tree { Label = "2_1_2" } } 
       } 
      }); 

      var a2 = new Stored { Name = "Stored2" }; 
      a2.Files.Add(new File 
      { 
       Name = "File1", 
       Schema = new Tree 
       { 
        Label = "1_1", 
        Children = new List<Tree> { new Tree { Label = "1_1_1" } } 
       } 
      }); 

      StoredItems.Add(a1); 
      StoredItems.Add(a2); 
     } 

     public List<Stored> StoredItems { get; } 
    } 

    class Stored 
    { 
     public string Name { get; set; } 
     public List<File> Files { get; } = new List<File>(); 
    } 

    class File 
    { 
     public string Name { get; set; } 
     public Tree Schema { get; set; } 
    } 

    class Tree 
    { 
     public string Label { get; set; } 
     public List<Tree> Children { get; set; } = new List<Tree>(); 
    } 
} 

ответ

1

Я не хочу, чтобы отобразить имя файла и вместо файла отображения его схемы

так изменить шаблон данных для файла

<HierarchicalDataTemplate DataType="{x:Type local:File}" 
          ItemsSource="{Binding Schema.Children}"> 
    <TextBlock Text="{Binding Schema.Label}"/> 
</HierarchicalDataTemplate> 

примечание стороны

Children = new List<Tree> { new Tree { Label = "2_1_1" }, new Tree { Label = "2_1_2" } } 

создает новый список внутри инициализатора объекта нет необходимости здесь. Он уже инициализирована (public List<Tree> Children { get; set; } = new List<Tree>();), и вы можете написать так:

Children = { new Tree { Label = "2_1_1" }, new Tree { Label = "2_1_2" } } 
+1

Черт, это было довольно просто. Что касается инициализации, я инициализировал список для каждого объекта, чтобы быть уверенным, что я не получаю нуль, я не делаю этого в реальном коде, просто хотел быстро раскрыть структуру. Все еще хорошо знаю этот синтаксический сахар. Спасибо. –

Смежные вопросы