/
dOJer113
/
lab3_3
Обзор
Документация
Войти
/
dOJer113
/
lab3_3
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
UI/ViewModels/MainWindowViewModel.cs
216 строк
8 KB
aleks
comments
30 апр 2025, 18:27
30 апр 2025, 18:27
8414405
Код
Авторство
О чём код?
using System.Collections.ObjectModel; using System.Reactive; using System.Reactive.Linq; using System.Threading.Tasks; using insects; using ReactiveUI; using UI.ViewModels.AddInsect; using UI.ViewModels.DeleteInsect; using UI.ViewModels.EditInsect; namespace UI.ViewModels; /// <summary> /// Главная ViewModel приложения, управляющая коллекцией насекомых и основными операциями CRUD /// </summary> public class MainWindowViewModel : ViewModelBase { public ObservableCollection<AbstractInsect> Insects { get; } = []; private AbstractInsect? _selectedInsect; /// <summary> /// Выбранное насекомое /// </summary> public AbstractInsect? SelectedInsect { get => _selectedInsect; set { this.RaiseAndSetIfChanged(ref _selectedInsect, value); this.RaisePropertyChanged(nameof(CanEditOrDelete)); } } public bool CanEditOrDelete => SelectedInsect != null; public Interaction<ViewModelBase, AbstractInsect?> ShowEditInsectDialog { get; } public Interaction<ViewModelBase, AbstractInsect?> ShowDeleteInsectDialog { get; } public ReactiveCommand<Unit, Unit> AddMonarchCommand { get; } public ReactiveCommand<Unit, Unit> AddNecrophagesCommand { get; } public ReactiveCommand<Unit, Unit> AddLadyBugCommand { get; } public ReactiveCommand<Unit, Unit> AddGlassCoverCommand { get; } public ReactiveCommand<Unit, Unit> EditCommand { get; } public ReactiveCommand<Unit, Unit> DeleteCommand { get; } public ReactiveCommand<Unit, Unit> GenerateTestValuesCommand { get; } /// <summary> /// Инициализирует новый экземпляр MainWindowViewModel, настраивая команды: /// <para>- Добавление/редактирование/удаление насекомых</para> /// <para>- Генерация тестовых данных</para> /// <para>- Настройка взаимодействий с диалоговыми окнами</para> /// </summary> public MainWindowViewModel() { DeleteCommand = ReactiveCommand.CreateFromTask(DeleteInsectCommand, this.WhenAnyValue(parX => parX.CanEditOrDelete)); ShowDeleteInsectDialog = new Interaction<ViewModelBase, AbstractInsect?>(); ShowEditInsectDialog = new Interaction<ViewModelBase, AbstractInsect?>(); EditCommand = ReactiveCommand.CreateFromTask(EditInsectCommand, this.WhenAnyValue(parX => parX.CanEditOrDelete)); AddGlassCoverCommand = ReactiveCommand.CreateFromTask(() => AddInsectRealisation(InsectType.GLASSCOVER)); AddMonarchCommand = ReactiveCommand.CreateFromTask(() => AddInsectRealisation(InsectType.MONARCH)); AddLadyBugCommand = ReactiveCommand.CreateFromTask(() => AddInsectRealisation(InsectType.LADY_BUG)); AddNecrophagesCommand = ReactiveCommand.CreateFromTask(() => AddInsectRealisation(InsectType.NECROPHAGES)); GenerateTestValuesCommand = ReactiveCommand.Create(GenerateTestInsects); } /// <summary> /// Создает и отображает диалоговое окно для добавления нового насекомого /// </summary> /// <param name="parType">Тип создаваемого насекомого из перечисления InsectType</param> /// <returns>Задача, представляющая асинхронную операцию добавления</returns> private async Task AddInsectRealisation(InsectType parType) { ViewModelBase? viewModel = parType switch { InsectType.LADY_BUG => new AddLadyBugViewModel(), InsectType.MONARCH => new AddMonarchViewModel(), InsectType.NECROPHAGES => new AddNecrophagesViewModel(), InsectType.GLASSCOVER => new AddGlassCoverViewModel(), _ => null }; if (viewModel is null) { return; } var result = await ShowEditInsectDialog.Handle(viewModel); if (result != null) { Insects.Add(result); SelectedInsect = result; } } /// <summary> /// Запускает процесс редактирования выбранного насекомого: /// <para>1. Создает соответствующую EditViewModel</para> /// <para>2. Отображает диалоговое окно редактирования</para> /// <para>3. Обновляет данные в коллекции при подтверждении</para> /// </summary> /// <returns>Задача, представляющая асинхронную операцию редактирования</returns> private async Task EditInsectCommand() { ViewModelBase? editViewModel = SelectedInsect switch { GlassCover glassCover => new EditGlassCoverViewModel(glassCover), Ladybug ladybug => new EditLadyBugViewModel(ladybug), Monarch monarch => new EditMonarchViewModel(monarch), Necrophages necrophages => new EditNecrophagesViewModel(necrophages), _ => null }; if (editViewModel is null) { return; } var result = await ShowEditInsectDialog.Handle(editViewModel); if (result != null) { Insects[Insects.IndexOf(SelectedInsect!)] = SelectedInsect = result; } } /// <summary> /// Выполняет удаление выбранного насекомого с подтверждением: /// <para>1. Создает ViewModel для диалога удаления</para> /// <para>2. Отображает диалог подтверждения</para> /// <para>3. Удаляет насекомое из коллекции при подтверждении</para> /// </summary> /// <returns>Задача, представляющая асинхронную операцию удаления</returns> private async Task DeleteInsectCommand() { if (SelectedInsect is null) return; ViewModelBase? deleteViewModel = SelectedInsect switch { GlassCover glassCover => new DeleteGlasscoverViewModel(glassCover), Ladybug ladybug => new DeleteLadybugViewModel(ladybug), Monarch monarch => new DeleteMonarchViewModel(monarch), Necrophages necrophages => new DeleteNecrophagesViewModel(necrophages), _ => null }; if (deleteViewModel is null) return; var result = await ShowDeleteInsectDialog.Handle(deleteViewModel); if (result != null) { Insects.Remove(SelectedInsect); SelectedInsect = null; } } /// <summary> /// Генерирует тестовый набор данных насекомых разных типов: /// <para>- Бабочка Монарх</para> /// <para>- Стеклокрылка</para> /// <para>- Божья коровка</para> /// <para>- Некрофаг</para> /// </summary> private void GenerateTestInsects() { Insects.Clear(); Insects.Add(new Monarch( parHasWings: true, parMouthpieceType: "Хоботок", parBodySize: 12.5m, parProboscisLength: "15 см", parMigrationRange: 4000)); // Стеклокрылка (GlassCover) Insects.Add(new GlassCover( parHasWings: true, parMouthpieceType: "Сосущий", parBodySize: 8.2m, parProboscisLength: "12 см", parWingsTransparencyDegree: 90)); // Божья коровка (Ladybug) Insects.Add(new Ladybug( parHasWings: true, parMouthpieceType: "Грызущий", parBodySize: 0.5m, parMandibleSize: 0.1m, parNumberOfSpots: 7)); // Некрофаг (Necrophages) Insects.Add(new Necrophages( parHasWings: false, parMouthpieceType: "Грызущий-сосущий", parBodySize: 2.3m, parMandibleSize: 0.8m, parStageOfSuccession: 3)); } }