private void ProjectService_ProjectOpened(Project project)
        {
            Items.Clear();
            Items.Add(new ProjectItemViewModel {
                Id = project.Id, Title = $"Project '{project.Name}'", Type = ProjectItemType.Project
            });
            foreach (var m in project.Modules)
            {
                var moduleItem = new ProjectItemViewModel {
                    Id = Guid.NewGuid(), Title = m.Name, Type = ProjectItemType.Module
                };
                Items.Add(moduleItem);
                RecursiveAppendProjectItems(moduleItem, Path.GetDirectoryName(_projectService.ProjectFilePath));
            }
            ProjectName     = project.Name;
            ProjectIsLoaded = true;

            OnPropertyChanged(nameof(ProjectIsLoaded));
        }
 private void ProjectService_ProjectItemChanged(ProjectItemChangedArgs args)
 {
     if (args.ItemType == ProjectItemType.Module && args.Change == ProjectItemChange.Rename)
     {
         foreach (var i in Items)
         {
             if (i.Title == args.ItemNameOld)
             {
                 i.Title = args.ItemName;
             }
         }
     }
     if (args.ItemType == ProjectItemType.Folder)
     {
         if (args.Change == ProjectItemChange.Create)
         {
             var parentItem = GetItemRecursive(Items, args.ParentSubPath.Split('\\'), 0);
             var folderItem = new ProjectItemViewModel
             {
                 Id     = Guid.NewGuid(),
                 Type   = ProjectItemType.Folder,
                 Title  = args.ItemName,
                 Parent = parentItem,
             };
             InsertFolderAlphabetically(parentItem.SubItems, folderItem);
         }
         else if (args.Change == ProjectItemChange.Rename)
         {
             var parentItem = GetItemRecursive(Items, args.ParentSubPath.Split('\\'), 0);
             var folderItem = parentItem.SubItems.FirstOrDefault(o => o.Title == args.ItemNameOld);
             parentItem.SubItems.Remove(folderItem);
             folderItem.Title = args.ItemName;
             InsertFolderAlphabetically(parentItem.SubItems, folderItem);
         }
     }
     if ((args.ItemType == ProjectItemType.Page || args.ItemType == ProjectItemType.Layout || args.ItemType == ProjectItemType.Workflow))
     {
         if (args.Change == ProjectItemChange.Create)
         {
             var parentItem   = GetItemRecursive(Items, args.ParentSubPath.Split('\\'), 0);
             var documentItem = new ProjectItemViewModel
             {
                 Id     = Guid.NewGuid(),
                 Type   = args.ItemType,
                 Title  = args.ItemName,
                 Parent = parentItem,
             };
             InsertDocumentAlphabetically(parentItem.SubItems, documentItem);
         }
         else if (args.Change == ProjectItemChange.Delete)
         {
             var parentItem   = GetItemRecursive(Items, args.ParentSubPath.Split('\\'), 0);
             var documentItem = parentItem.SubItems.FirstOrDefault(o => o.Title == args.ItemName && o.Type == args.ItemType);
             parentItem.SubItems.Remove(documentItem);
         }
         else if (args.Change == ProjectItemChange.Rename)
         {
             var parentItem   = GetItemRecursive(Items, args.ParentSubPath.Split('\\'), 0);
             var documentItem = parentItem.SubItems.FirstOrDefault(o => o.Title == args.ItemNameOld && o.Type == args.ItemType);
             parentItem.SubItems.Remove(documentItem);
             documentItem.Title = args.ItemName;
             InsertFolderAlphabetically(parentItem.SubItems, documentItem);
         }
     }
 }
        private void RecursiveAppendProjectItems(ProjectItemViewModel currentItem, string parentPath)
        {
            var currentPath = Path.Combine(parentPath, currentItem.Title);

            if (currentItem.SubItems == null)
            {
                currentItem.SubItems = new ObservableCollection <IProjectItemViewModel>();
            }

            // Alle Ordner darstellen
            foreach (var dirName in Directory.GetDirectories(currentPath).Select(dir => {
                var info = new DirectoryInfo(dir);
                return(info.Name);
            }).OrderBy(dirName => dirName))
            {
                var folderItem = new ProjectItemViewModel
                {
                    Id     = Guid.NewGuid(),
                    Type   = ProjectItemType.Folder,
                    Title  = dirName,
                    Parent = currentItem,
                };
                currentItem.SubItems.Add(folderItem);
                RecursiveAppendProjectItems(folderItem, currentPath);
            }

            // Alle Dateien die zum Projekt gehören
            foreach (var file in Directory.GetFiles(currentPath).Select(o => Path.GetFileName(o)).OrderBy(fileName => fileName))
            {
                if (file.EndsWith(Constants.ProjectItemFileExtensions.Page))
                {
                    currentItem.SubItems.Add(new ProjectItemViewModel
                    {
                        Id     = Guid.NewGuid(),
                        Type   = ProjectItemType.Page,
                        Title  = file.Split('.')[0],
                        Parent = currentItem,
                    });
                }
                if (file.EndsWith(Constants.ProjectItemFileExtensions.Layout))
                {
                    currentItem.SubItems.Add(new ProjectItemViewModel
                    {
                        Id     = Guid.NewGuid(),
                        Type   = ProjectItemType.Layout,
                        Title  = file.Split('.')[0],
                        Parent = currentItem,
                    });
                }
                if (file.EndsWith(Constants.ProjectItemFileExtensions.Workflow))
                {
                    currentItem.SubItems.Add(new ProjectItemViewModel
                    {
                        Id     = Guid.NewGuid(),
                        Type   = ProjectItemType.Workflow,
                        Title  = file.Split('.')[0],
                        Parent = currentItem,
                    });
                }
            }
        }