103 lines
2.9 KiB
C#
103 lines
2.9 KiB
C#
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using System.Collections.ObjectModel;
|
|
|
|
namespace CodeContextGenerator.Models;
|
|
|
|
public partial class FileItem : ObservableObject
|
|
{
|
|
[ObservableProperty]
|
|
private string name;
|
|
|
|
[ObservableProperty]
|
|
private string fullName;
|
|
|
|
[ObservableProperty]
|
|
private bool isDirectory;
|
|
|
|
[ObservableProperty]
|
|
[NotifyPropertyChangedFor(nameof(HasSelectedChildren))]
|
|
private bool? isSelected;
|
|
|
|
[ObservableProperty]
|
|
private FileItem parent;
|
|
|
|
public ObservableCollection<FileItem> Children { get; } = new ObservableCollection<FileItem>();
|
|
|
|
// Событие, вызываемое при изменении состояния выбора
|
|
public event EventHandler SelectionChanged;
|
|
|
|
public bool HasSelectedChildren => Children.Any(c => c.IsSelected == true || c.HasSelectedChildren);
|
|
|
|
partial void OnIsSelectedChanged(bool? oldValue, bool? newValue)
|
|
{
|
|
if (newValue.HasValue)
|
|
{
|
|
UpdateChildrenSelection(newValue.Value);
|
|
}
|
|
UpdateParentSelection();
|
|
NotifySelectionChanged();
|
|
}
|
|
|
|
private void UpdateChildrenSelection(bool value)
|
|
{
|
|
if (!IsDirectory) return;
|
|
|
|
foreach (var child in Children)
|
|
{
|
|
// Гарантируем вызов события для каждого ребенка
|
|
var oldValue = child.IsSelected;
|
|
child.IsSelected = value;
|
|
if (oldValue != child.IsSelected)
|
|
{
|
|
child.RaiseSelectionChanged();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void UpdateParentSelection()
|
|
{
|
|
if (Parent == null) return;
|
|
|
|
var children = Parent.Children;
|
|
var allSelected = children.All(c => c.IsSelected == true);
|
|
var noneSelected = children.All(c => c.IsSelected == false);
|
|
var hasIndeterminate = children.Any(c => c.IsSelected == null);
|
|
|
|
bool? newParentState = hasIndeterminate ? null : (allSelected ? true : (noneSelected ? false : null));
|
|
/*bool? newParentState;
|
|
if (hasIndeterminate)
|
|
{
|
|
newParentState = null;
|
|
}
|
|
else if (allSelected)
|
|
{
|
|
newParentState = true;
|
|
}
|
|
else if (noneSelected)
|
|
{
|
|
newParentState = false;
|
|
}
|
|
else
|
|
{
|
|
newParentState = null;
|
|
}*/
|
|
|
|
if (Parent.IsSelected != newParentState)
|
|
{
|
|
Parent.IsSelected = newParentState;
|
|
Parent.RaiseSelectionChanged();
|
|
}
|
|
}
|
|
|
|
private void NotifySelectionChanged()
|
|
{
|
|
RaiseSelectionChanged();
|
|
}
|
|
|
|
// Публичный метод для гарантии вызова события
|
|
public void RaiseSelectionChanged()
|
|
{
|
|
// Вызываем событие для текущего элемента
|
|
SelectionChanged?.Invoke(this, EventArgs.Empty);
|
|
}
|
|
} |