Machen Sie die XAML -Sammlungsansichten in Maui.net rekursiv
Posted: 21 Mar 2025, 00:19
Ich erstelle einen benutzerdefinierten Datei -Explorer für meine mobile App in Maui auf .NET 9. Bisher sind die Erstellung und das Laden von Ordner/Datei wiederholt (Code ermöglicht unendliche Verschachtung). Das Problem, auf das ich jetzt begegnet bin, ist jedoch, dass das XAML selbst rekursiv macht, ohne nur immer mehr Sammlungsansichten zu verhindern.
Hier ist die DateiItem Modellklasse:
Code: Select all
< /code>
Und dies ist der Code dahinter, der die Dateien lädt (scheint in Ordnung zu funktionieren, wenn ich das Verzeichnis auf meinem Telefon inspiziere): < /p>
private void LoadFilesAndFolders()
{
if (Directory.Exists(_myReSEEptImagesFolder))
{
var items = Directory.GetFileSystemEntries(_myReSEEptImagesFolder);
foreach (var item in items)
{
var fileItem = new FileItem
{
Name = Path.GetFileName(item),
Parent = null,
Path = item,
IsFolder = Directory.Exists(item),
Items = new ObservableCollection(),
OnTappedCallback = OpenPath
};
if (fileItem.IsFolder)
{
LoadSubfolderItems(fileItem);
}
FileItems.Add(fileItem);
}
}
}
// Recursive function to load subfolders
private void LoadSubfolderItems(FileItem parentFolder)
{
var subItems = Directory.GetFileSystemEntries(parentFolder.Path);
foreach (var subItem in subItems)
{
var subFileItem = new FileItem
{
Name = Path.GetFileName(subItem),
Parent = parentFolder,
Path = subItem,
IsFolder = Directory.Exists(subItem),
Items = new ObservableCollection(),
OnTappedCallback = OpenPath
};
// If it's a folder, recursively load its children
if (subFileItem.IsFolder)
{
LoadSubfolderItems(subFileItem);
}
parentFolder.Items.Add(subFileItem);
}
}
Code: Select all
public class FileItem : INotifyPropertyChanged
{
public FileItem? Parent;
private bool _isSelected;
private string _name;
private bool _isFolder;
private ObservableCollection _items;
private bool _isExpanded;
private string _path;
public event PropertyChangedEventHandler PropertyChanged;
public string DisplayName => IsFolder
? (Parent != null ? $"└─ 📁 {Name}" : $"📁 {Name}")
: $"└─ 📜 {Name}";
public bool IsSelected
{
get => _isSelected;
set
{
if (_isSelected != value)
{
_isSelected = value;
OnPropertyChanged(nameof(IsSelected));
}
}
}
public string Name
{
get => _name;
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged(nameof(Name));
OnPropertyChanged(nameof(DisplayName));
}
}
}
public string Path
{
get => _path;
set => SetProperty(ref _path, value);
}
public bool IsFolder
{
get => _isFolder;
set
{
if (SetProperty(ref _isFolder, value) && _isFolder && _items == null)
{
Items = new ObservableCollection();
}
}
}
public bool IsExpanded
{
get => _isExpanded;
set
{
_isExpanded = value;
OnPropertyChanged(nameof(IsExpanded));
}
}
public ObservableCollection Items
{
get => _items;
set => SetProperty(ref _items, value);
}
public ICommand TapCommand { get; }
// Callbacks for external handling
public Action OnTappedCallback { get; set; }
public FileItem()
{
TapCommand = new Command(ExecuteTapCommand);
}
private void ExecuteTapCommand()
{
OnTappedCallback?.Invoke(this);
}
protected bool SetProperty(ref T storage, T value, [CallerMemberName] string propertyName = null)
{
if (Equals(storage, value)) return false;
storage = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
return true;
}
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}