diff --git a/ArcExplorer/ViewModels/MainWindowViewModel.cs b/ArcExplorer/ViewModels/MainWindowViewModel.cs index 078599a..e1c3468 100644 --- a/ArcExplorer/ViewModels/MainWindowViewModel.cs +++ b/ArcExplorer/ViewModels/MainWindowViewModel.cs @@ -17,7 +17,12 @@ public class MainWindowViewModel : ViewModelBase public AvaloniaList Files { get; } = new AvaloniaList(); // TODO: Temporary workaround to avoid converting the FileTree logic to use FileGridItem. - public AvaloniaList Items { get; } = new AvaloniaList(); + public AvaloniaList Items + { + get => items; + set => this.RaiseAndSetIfChanged(ref items, value); + } + private AvaloniaList items = new AvaloniaList(); public static Dictionary DescriptionByRegion { get; } = new Dictionary { @@ -81,7 +86,7 @@ public string? CurrentDirectoryPath { get => currentDirectoryPath; set - { + { if (arcFile != null && value != currentDirectoryPath) { this.RaiseAndSetIfChanged(ref currentDirectoryPath, value); @@ -96,8 +101,8 @@ public string? CurrentDirectoryPath } private string? currentDirectoryPath; - public FolderNode? CurrentDirectory - { + public FolderNode? CurrentDirectory + { get => currentDirectory; set { @@ -186,15 +191,18 @@ public MainWindowViewModel() // HACK: DataGrid doesn't seem to support multiple types, so use a wrapper type. Files.CollectionChanged += (s, e) => { - Items.Clear(); + var newItems = new List(); foreach (var node in Files) { if (node is FileNode file) - Items.Add(new FileGridItem(file)); + newItems.Add(new FileGridItem(file)); else if (node is FolderNode folder) - Items.Add(new FileGridItem(folder)); + newItems.Add(new FileGridItem(folder)); } + // Recreating the list is faster than adding items individually. + Items = new AvaloniaList(newItems); + // HACK: Adding files to the file list increments selected index? SelectedFileIndex = 0; }; @@ -251,7 +259,7 @@ private void InitializeArcFile(string arcPathText) ArcVersion = arcFile.Version.ToString(); Files.Clear(); - var newFiles = FileTree.CreateRootLevelNodes(arcFile, + var newFiles = FileTree.CreateRootLevelNodes(arcFile, BackgroundTaskStart, BackgroundTaskReportProgress, BackgroundTaskEnd, ApplicationSettings.Instance.MergeTrailingSlash); Files.AddRange(newFiles); } @@ -291,7 +299,7 @@ public void ExitFolder() return; } - // Go up one level in the file tree. + // Go up one level in the file tree. var parent = FileTree.CreateFolderNode(arcFile, parentPath); if (parent == null) LoadRootNodes(arcFile); @@ -360,7 +368,7 @@ public void ExtractAllFiles() if (arcFile == null) return; - FileTree.ExtractAllFiles(arcFile, + FileTree.ExtractAllFiles(arcFile, BackgroundTaskStart, BackgroundTaskReportProgress, BackgroundTaskEnd, ApplicationSettings.Instance.MergeTrailingSlash); }