Listowanie ObservableCOllection<T> do ListView

0

Witam!

Piszę aktualnie apkę w WPF i mam pewien problem - chciałbym zrobić coś na kształt drzewa plików i folderów. Chciałbym, żeby to wyglądało podobnie jak tutaj:
title

Ale mam problem z tym, że w każdym folderze mogą być kolejne foldery i nie wiem jak to zaimplementować.

W uproszczeniu mam coś takiego:

class Folder{
        public ObservableCollection<string> ListOfFoldersPath { get; set; }
        public ObservableCollection<string> ListOfFilesPath { get; set; }
        public ObservableCollection<Folder> ListOfFolders { get; set; }
}
class MainWindowViewModel : INotifyPropertyChanged
{
        private ObservableCollection<Folder> _listOfFoldersToAdd;

        private string DefaultDirectory = "Sounds";

        public MainWindowViewModel()
        {
            ListOfFoldersToAdd = new ObservableCollection<Folder>();

            ListOfFoldersToAdd.Add(new Folder(AppDomain.CurrentDomain.BaseDirectory + DefaultDirectory));
        }
        public ObservableCollection<Folder> ListOfFoldersToAdd
        {
            get { return _listOfFoldersToAdd; }
            set
            {
                _listOfFoldersToAdd = value; 
                OnPropertyChanged(nameof(ListOfFoldersToAdd));
            }
        }
}

Jak zrobić ListBoxa tak, aby każdy kolejny folder można było rozwinąć?

0

A nie lepiej byłoby użyć tree view
http://www.wpf-tutorial.com/treeview-control/simple-treeview/

0

Masz rację, to lepsze rozwiązanie, ale nadal nie wiem jak zrobić dowolną "głębokość drzewa"

0

Ja aktualnie pracuję nad podobnym projektem (w sumie to ostatnio nic z tym nie robiłem bo nie miałem czasu) , w sensie też potrzebuję mieć drzewko o nieznanej głębokości przechowujące różne typu. No i tak sobie to na razie rozwiązałem:

mam interfejsik IContainer

    interface IContainer
    {
        string Name { get; set; }

        ContainerType Type { get; }
    }

No i potem mam różne klasy z kontenerami, które implementują ten interfejsik

class Container : IContainer
    {
        public string Name
        {
            get;
            set;
        }

        public ContainerType Type { get; private set; } = ContainerType.Container;

        List<IContainer> _elements = new List<IContainer>();

        public void Add(IContainer element)
        {
            elements.Add(element);
        }

        public Container Find(string path)
        {
		...
	}
}
    class FileContainer : IContainer
    {
        public string Name
        {
            get;
            set;
        }

        public ContainerType Type { get; private set; } = ContainerType.File;

        public List<File> Items { get; private set; }
    }

klasa Container odpowiada tak jakby folderom i w liście elements może zawierać zarówno kolejne foldery (Container) lub kontenery na określony typ np. (TaskContainer, FileContainer itd). Natomiast typ FileContainer może już zawierać tylko elementy typu File.

Jak chce się dobrać, do któregoś z kontenerów i jego zawartości no to IContainer zawiera właściwość Type i na jej podstawie rzutuje wybrany element na odpowiedni typ (aktualnie tak chyba robilem), ale o wiele lepiej będzie użyć odzwierciedlania i używać metody GetType(). Tak mi się wydaje. Przeznaczeniem tej właściwości było dodawanie odpowiedniego znacznika do wyświetlanej listy (będzie znacznik - ikonka i nazwa).

W sumie Ty będziesz miał coś podobnego do mnie bo możesz mieć w folderze zarówno kolejny folder jak i plik, więc to są dwa różne typy i musisz je jakoś rozróżniać, więc zamiast IContainer zrobisz sobie np. interfejsik IElement. Przy robieniu tego wzorowałem się na treeView tylko, że tam jest jeden typ Node, który zawiera kolekcję Node, czyli to by odpowiadało klasie Container.

Jak ktoś będzie miał lepszy pomysł to też chętnie skorzystam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1