using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input; using YouTubeViewers.WPF.Commands; using YouTubeViewers.Domain.Models; using YouTubeViewers.WPF.Stores; namespace YouTubeViewers.WPF.ViewModels { public class YouTubeViewersListingViewModel : ViewModelBase { private readonly ObservableCollection _youtubeViewersListingItemViewModels; private readonly YouTubeViewersStore _youTubeViewersStore; private readonly SelectedYouTubeViewerStore _selectedYouTubeViewerStore; private readonly ModalNavigationStore _modalNavigationStore; public IEnumerable YouTubeViewersListingItemViewModels => _youtubeViewersListingItemViewModels; private YouTubeViewersListingItemViewModel _selectedYouTubeViewerListingItemViewModel; public YouTubeViewersListingItemViewModel SelectedYouTubeViewerListingItemViewModel { get { return _selectedYouTubeViewerListingItemViewModel; } set { _selectedYouTubeViewerListingItemViewModel = value; OnPropertyChanged(nameof(SelectedYouTubeViewerListingItemViewModel)); _selectedYouTubeViewerStore.SelectedYouTubeViewer = _selectedYouTubeViewerListingItemViewModel?.YouTubeViewer; } } public YouTubeViewersListingViewModel( YouTubeViewersStore youTubeViewersStore, SelectedYouTubeViewerStore selectedYouTubeViewerStore, ModalNavigationStore modalNavigationStore) { _youTubeViewersStore = youTubeViewersStore; _selectedYouTubeViewerStore = selectedYouTubeViewerStore; _modalNavigationStore = modalNavigationStore; _youtubeViewersListingItemViewModels = new ObservableCollection(); _youTubeViewersStore.YouTubeViewersLoaded += _youTubeViewersStore_YouTubeViewersLoaded; _youTubeViewersStore.YouTubeViewerAdded += YouTubeViewersStore_YouTubeViewerAdded; _youTubeViewersStore.YouTubeViewerUpdated += YouTubeViewersStore_YouTubeViewerUpdated; _youTubeViewersStore.YouTubeViewerDeleted += YouTubeViewersStore_YouTubeViewerDeleted; } private void _youTubeViewersStore_YouTubeViewersLoaded() { _youtubeViewersListingItemViewModels.Clear(); foreach (YouTubeViewer youTubeViewer in _youTubeViewersStore.YouTubeViewers) { AddYouTubeViewer(youTubeViewer); } } private void YouTubeViewersStore_YouTubeViewerUpdated(YouTubeViewer youTubeViewer) { YouTubeViewersListingItemViewModel youTubeViewerViewModel = _youtubeViewersListingItemViewModels.FirstOrDefault(x => x.YouTubeViewer.Id == youTubeViewer.Id); if (youTubeViewerViewModel != null) { youTubeViewerViewModel.Update(youTubeViewer); } } protected override void Dispose() { _youTubeViewersStore.YouTubeViewersLoaded -= _youTubeViewersStore_YouTubeViewersLoaded; _youTubeViewersStore.YouTubeViewerAdded -= YouTubeViewersStore_YouTubeViewerAdded; _youTubeViewersStore.YouTubeViewerUpdated -= YouTubeViewersStore_YouTubeViewerUpdated; _youTubeViewersStore.YouTubeViewerDeleted -= YouTubeViewersStore_YouTubeViewerDeleted; base.Dispose(); } private void YouTubeViewersStore_YouTubeViewerAdded(YouTubeViewer youTubeViewer) { AddYouTubeViewer(youTubeViewer); } private void AddYouTubeViewer(YouTubeViewer youTubeViewer) { YouTubeViewersListingItemViewModel itemViewModel = new YouTubeViewersListingItemViewModel(youTubeViewer, _youTubeViewersStore, _modalNavigationStore); _youtubeViewersListingItemViewModels.Add(itemViewModel); } private void YouTubeViewersStore_YouTubeViewerDeleted(Guid id) { YouTubeViewersListingItemViewModel itemViewModel = _youtubeViewersListingItemViewModels.FirstOrDefault(y => y.YouTubeViewer?.Id == id); if (itemViewModel != null) { _youtubeViewersListingItemViewModels.Remove(itemViewModel); } } } }