Иерархические данные привязки данных WPF Treeview со смешанными типами
у меня есть немного сложная ситуация с привязкой WPF Treeview. Я провел последние 2 дня, пытаясь Google it, и этой - это я придумал, но это не решит проблему.
ситуация такова:
у меня есть объект, который выглядит так:
public class Category
{
public string Name { get; set; }
public List<Category> Categories { get; set; }
public List<Product> Products { get; set; }
}
public class Product
{
public string Name { get; set;
}
каждая категория может иметь список объектов и дочерних категорий. У меня есть причина для этого, что имеет полный смысл для меня, и приложение я пишу.
фактическая конструкция объекта может выглядеть примерно так:
Category - Pharmacy
|-Product - Aspirin
|-Product - Tylenol
|-Category - Tooth Paste
| |-Product - Crest
| |-Product - Colgate
|-Category - Paper Products
|-Category - Toilet Paper
| |-Product - NoName
| |-Product - Charmin
|-Category - Facial Tissue
|-Product - Kleenex
Category - Household
|-Product - Pinesol Cleaner
|-Product - Garbage Bags
Теперь я пытаюсь привязать это отношение к treeview. Я хотел бы, чтобы TreeView выглядел почти идентично вышеупомянутой конструкции объекта.
пока у меня есть мой XAML Treeview выглядит так:
<TreeView x:Name="CategoryList" Margin="8" Grid.Row="2" Grid.RowSpan="2" ItemsSource="{Binding Path=Categories}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type src:Category}" ItemsSource="{Binding Products}">
<StackPanel>
<TextBlock Text="{Binding Path=Name}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type src:Product}">
<StackPanel>
<TextBlock Text="{Binding Path=Name}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
Это отлично подходит для основного списка категорий, и каждый из его субпродуктов. Но он не идет глубже и отображает подкатегории под каждым категория.
есть ли способ сделать это напрямую с шаблонами, чтобы выбрать каждый элемент (категорию или продукт)? Я использую шаблон MVVM и не хочу прибегать к использованию кода, но буду, если это необходимо.
1 ответов
поскольку вы хотите, чтобы элементы в TreeView имели список дочерних элементов, который состоит из продуктов обеих категорий, вы захотите, чтобы ваша категория ViewModel имела коллекцию, которая состоит из обеих категорий и продуктов. Например, вы можете использовать CompositeCollection чтобы объединить существующие коллекции:
public class Category
{
public string Name { get; set; }
public List<Category> Categories { get; set; }
public List<Product> Products { get; set; }
public IList Children
{
get
{
return new CompositeCollection()
{
new CollectionContainer() { Collection = Products },
new CollectionContainer() { Collection = Categories }
};
}
}
}
(в реальном коде вы, вероятно, захотите сохранить ссылку на один и тот же объект коллекции, а не создавать новый каждый раз.)
затем в HierarchicalDataTemplate используйте объединенный список в качестве ItemsSource:
<HierarchicalDataTemplate DataType="{x:Type src:Category}"
ItemsSource="{Binding Children}">
элементы будут представлять собой смесь объектов Product и Category, и WPF будет использовать соответствующую DataTemplate для каждого из них.