using CommunityToolkit.Mvvm.ComponentModel; using System.Collections.ObjectModel; using System.Windows; using Livia.Models.Data; using Livia.Models; using Microsoft.Extensions.Logging; using CommunityToolkit.Mvvm.Messaging; using Livia.Utility; namespace Livia.ViewModels; public class PerfusionParameter : ObservableObject { public bool IsChecked { get => _isChecked; set => SetProperty(ref _isChecked, value); } public string Name { get => _name; init => SetProperty(ref _name, value); } private bool _isChecked; private readonly string _name = string.Empty; } public class PerfusionDataGridGroupControlViewModel : ObservableRecipient, ILiviaModuleViewModel, IRecipient { public ObservableCollection PerfusionDataGridViewModelCollection { get; } = []; public ObservableCollection Parameters { get; } = []; private DataBlock? _currentDataBlock; private readonly IDataBlockLoader _dataBlockLoader; private readonly ILogger _logger; public PerfusionDataGridGroupControlViewModel(IDataBlockLoader dataBlockLoader, ILogger logger) { _dataBlockLoader = dataBlockLoader; _logger = logger; WeakReferenceMessenger.Default.RegisterAll(this); } public async Task LoadData(DataBlock dataBlock) { Parameters.Clear(); AdditionalInfoJson additionalInfo = _dataBlockLoader.GetSharedData("additionalInfo"); foreach (KeyValuePair> keyValuePair in additionalInfo.AtlasInfoListDict) { PerfusionParameter parameter = new() { Name = keyValuePair.Key, IsChecked = keyValuePair.Key == PerfusionDataGridControlViewModel.LoadAtlasName }; Parameters.Add(parameter); } Task[] loadTasks = PerfusionDataGridViewModelCollection.Select(perfusionDataGridControlViewModel => perfusionDataGridControlViewModel.LoadData(dataBlock)).ToArray(); await Task.WhenAll(loadTasks); _currentDataBlock = dataBlock; } public void Init() { } public void Receive(PerfusionDataGridChangeParameterMessage message) { _logger.LogInformation($"PerfusionDataGrid switching to {message.Value}"); if (_currentDataBlock == null) return; PerfusionDataGridControlViewModel.LoadAtlasName = message.Value.Item1; foreach (PerfusionDataGridControlViewModel perfusionDataGridControlViewModel in PerfusionDataGridViewModelCollection) { Application.Current.Dispatcher.Invoke(() => perfusionDataGridControlViewModel.LoadData(_currentDataBlock)); } //update radio button state foreach (PerfusionParameter parameter in Parameters) { if (parameter.Name != message.Value.Item1) continue; parameter.IsChecked = true; return; } } }