следущие моделиМОФ 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>();
}
}
Черт, это было довольно просто. Что касается инициализации, я инициализировал список для каждого объекта, чтобы быть уверенным, что я не получаю нуль, я не делаю этого в реальном коде, просто хотел быстро раскрыть структуру. Все еще хорошо знаю этот синтаксический сахар. Спасибо. –