Hallo,
ich bin gerade an einem kleinen Programm.
Dort möchte ich Artikelstämme mit Kategorien, UnterKategorien und/oder Artikeln in einem TreeView anzeigen.
Ich habe dazu ein kleines Beispielprojekt angehangen.
Es gibt 2 Artikelstämme. Diese haben jeweils 2 Kategorien. Diese wiederum haben in der ersten Kategorie Artikel und in der 2. Kategorie eine Unterkategorie die wiederum 1 Artikel hat.
Die Model dazu sehen so aus:
Im ViewModel habe ich eine ObservableCollection von ArtikelMaster die im Constructor gefüllt wird.
im Provider wird eine FakeListe erstellt:
Im MainWindow habe ich ein TreeView welches als ItemSource an die Property im VM gebunden ist (Masters).
Dann füge ich dem TreeView.ItemTemplate HierarchicalDataTemplate hinzu und setze die ItemSource jeweils auf die Propertys der Masters Collection:
Das funktioniert soweit auch bestens. allerdings fehlt mir jeweils in der ersten Kategorie der Artikel.
Es muss also vor den SubCategories noch irgendwie die Artikelliste rein.
Ich stehe nur grad auf dem Schlauch wie.
Hab einiges im Netz gelesen aber das bezieht sich meist darauf, wie man ein Treeview mit einer Liste und einer UnterListe aufbaut.
Hat jemand ne Idee wie ich das hin bekomme?
Danke Euch
Grüße
ich bin gerade an einem kleinen Programm.
Dort möchte ich Artikelstämme mit Kategorien, UnterKategorien und/oder Artikeln in einem TreeView anzeigen.
Ich habe dazu ein kleines Beispielprojekt angehangen.
Es gibt 2 Artikelstämme. Diese haben jeweils 2 Kategorien. Diese wiederum haben in der ersten Kategorie Artikel und in der 2. Kategorie eine Unterkategorie die wiederum 1 Artikel hat.
Die Model dazu sehen so aus:
C#-Quellcode
-
- public class ArticleMaster
- {
- public int Id { get; set; }
- public string MasterName { get; set; }
- public ICollection<ArticleCategory> Categories { get; set; }
- }
- public class ArticleCategory
- {
- public int Id { get; set; }
- public string CategoryName { get; set; }
- public ICollection<ArticleCategory> SubCategories { get; set; }
- public ICollection<Article> Articles { get; set; }
- }
- public class Article
- {
- public int Id { get; set; }
- public string Name { get; set; }
- public int CategoryId { get; set; }
- public ArticleCategory Category { get; set; }
- }
Im ViewModel habe ich eine ObservableCollection von ArtikelMaster die im Constructor gefüllt wird.
C#-Quellcode
-
- public class MainWindowViewModel : ViewModelBase
- {
- private readonly IMemoryDataProvider _dataProvider;
- public MainWindowViewModel()
- {
- _dataProvider = new MemoryDataProvider();
- LoadArticleMasters();
- }
- private ObservableCollection<ArticleMaster> _masters;
- public ObservableCollection<ArticleMaster> Masters { get => _masters; set => SetValue(ref _masters, value); }
- private void LoadArticleMasters()
- {
- var list = _dataProvider.GetArticleMasters();
- Masters = new ObservableCollection<ArticleMaster>();
- list.ForEach(m => Masters.Add(m));
- }
- }
im Provider wird eine FakeListe erstellt:
C#-Quellcode
-
- public class MemoryDataProvider : IMemoryDataProvider
- {
- public List<ArticleMaster> GetArticleMasters()
- {
- var list = new List<ArticleMaster>();
- list.Add(CreateArticleMaster("ArtikelStamm_1"));
- list.Add(CreateArticleMaster("ArtikelStamm_2"));
- return list;
- }
- private ArticleMaster CreateArticleMaster(string masterName)
- {
- var master = new ArticleMaster
- {
- Id = 1,
- MasterName = masterName
- };
- master.Categories = CreateCategories();
- return master;
- }
- private List<ArticleCategory> CreateCategories()
- {
- var list = new List<ArticleCategory>();
- list.Add(new ArticleCategory
- {
- Id = 1,
- CategoryName = "CategoryWithChildren",
- Articles = new List<Article> { new Article
- {
- Id = 1,
- Name = "FirstArticle", CategoryId = 1
- } }
- });
- list.Add(new ArticleCategory
- {
- Id = 2,
- CategoryName = "´CategoryWithSubCategories",
- SubCategories = new List<ArticleCategory> { new ArticleCategory
- {
- Id = 1,
- CategoryName = "SubCategoryWithChildren",
- Articles = new List<Article>
- {
- new Article
- {
- Id = 1,
- Name = "ArticleInSub",
- CategoryId = 1
- }
- }
- } }
- });
- return list;
- }
- }
Im MainWindow habe ich ein TreeView welches als ItemSource an die Property im VM gebunden ist (Masters).
Dann füge ich dem TreeView.ItemTemplate HierarchicalDataTemplate hinzu und setze die ItemSource jeweils auf die Propertys der Masters Collection:
XML-Quellcode
-
- <Window.DataContext>
- <vm:MainWindowViewModel/>
- </Window.DataContext>
- <Grid>
- <TreeView ItemsSource="{Binding Masters}">
- <TreeView.ItemTemplate>
- <HierarchicalDataTemplate ItemsSource="{Binding Categories}">
- <StackPanel Orientation="Horizontal">
- <Label Content="{Binding Id}"/>
- <Label Content="{Binding MasterName}"/>
- </StackPanel>
- <HierarchicalDataTemplate.ItemTemplate>
- <HierarchicalDataTemplate ItemsSource="{Binding SubCategories}">
- <StackPanel Orientation="Horizontal">
- <Label Content="{Binding Id}"/>
- <Label Content="{Binding CategoryName}"/>
- </StackPanel>
- <HierarchicalDataTemplate.ItemTemplate>
- <HierarchicalDataTemplate ItemsSource="{Binding Articles}">
- <StackPanel Orientation="Horizontal">
- <Label Content="{Binding Id}"/>
- <Label Content="{Binding CategoryName}"/>
- </StackPanel>
- <HierarchicalDataTemplate.ItemTemplate>
- <DataTemplate>
- <StackPanel Orientation="Horizontal">
- <Label Content="{Binding Id}"/>
- <Label Content="{Binding Name}"/>
- </StackPanel>
- </DataTemplate>
- </HierarchicalDataTemplate.ItemTemplate>
- </HierarchicalDataTemplate>
- </HierarchicalDataTemplate.ItemTemplate>
- </HierarchicalDataTemplate>
- </HierarchicalDataTemplate.ItemTemplate>
- </HierarchicalDataTemplate>
- </TreeView.ItemTemplate>
- </TreeView>
- </Grid>
Das funktioniert soweit auch bestens. allerdings fehlt mir jeweils in der ersten Kategorie der Artikel.
Es muss also vor den SubCategories noch irgendwie die Artikelliste rein.
Ich stehe nur grad auf dem Schlauch wie.
Hab einiges im Netz gelesen aber das bezieht sich meist darauf, wie man ein Treeview mit einer Liste und einer UnterListe aufbaut.
Hat jemand ne Idee wie ich das hin bekomme?
Danke Euch
Grüße
"Hier könnte Ihre Werbung stehen..."