From 6e738becd47bcbd9283db5deaff7f3d209ba1698 Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Sun, 11 Feb 2024 22:18:40 +0000 Subject: [PATCH] more settings work --- .../ViewModelTemplateSelector.cs | 18 +++++++++------ .../MediaControllerViewModel.cs | 2 +- .../MediaControllerWidgetView.xaml | 5 ++-- .../PrimaryWidgetViewModel.cs | 4 +--- .../IServiceCollectionExtensions.cs | 4 ++-- Hyperbar.Widget.Windows/WidgetView.xaml.cs | 1 - .../IServiceCollectionExtensions.cs | 6 +++-- Hyperbar.Widget/IWidgetHostCollection.cs | 7 ++++++ Hyperbar.Widget/WidgetBuilder.cs | 6 ++--- Hyperbar.Widget/WidgetExtensionHandler.cs | 6 ++--- Hyperbar.Widget/WidgetHost.cs | 23 +++++-------------- Hyperbar.Widget/WidgetHostCollection.cs | 21 +++++++++++++++++ Hyperbar.Widget/WidgetHostHandler.cs | 8 ++++--- Hyperbar.Windows/App.xaml.cs | 6 ++++- Hyperbar.Windows/Hyperbar.Windows.csproj | 6 +++++ Hyperbar.Windows/PrimaryViewModel.cs | 1 - Hyperbar.Windows/SettingsView.xaml | 4 +++- Hyperbar.Windows/WidgetNavigationView.xaml | 6 +++++ Hyperbar.Windows/WidgetNavigationView.xaml.cs | 11 +++++++++ Hyperbar.Windows/WidgetNavigationViewModel.cs | 8 +++---- .../WidgetNavigationViewModelEnumerator.cs | 15 ++++++++++++ .../WidgetSettingsNavigationView.xaml | 7 +++++- .../WidgetSettingsNavigationView.xaml.cs | 1 - .../WidgetSettingsNavigationViewModel.cs | 13 ++++++++--- Hyperbar.Windows/WidgetSettingsViewModel.cs | 23 ++++++++----------- Hyperbar/IServiceCollectionExtensions.cs | 6 ++--- Hyperbar/IViewModelTemplate.cs | 2 +- Hyperbar/NavigateHandler.cs | 3 +-- Hyperbar/ObservableCollectionViewModel.cs | 2 +- Hyperbar/Publisher.cs | 3 +-- Hyperbar/SubscriptionManager.cs | 1 + Hyperbar/ViewModelTemplate.cs | 2 +- Hyperbar/ViewModelTemplateProvider.cs | 1 + 33 files changed, 152 insertions(+), 80 deletions(-) create mode 100644 Hyperbar.Widget/IWidgetHostCollection.cs create mode 100644 Hyperbar.Widget/WidgetHostCollection.cs create mode 100644 Hyperbar.Windows/WidgetNavigationView.xaml create mode 100644 Hyperbar.Windows/WidgetNavigationView.xaml.cs create mode 100644 Hyperbar.Windows/WidgetNavigationViewModelEnumerator.cs diff --git a/Hyperbar.UI.Windows/ViewModelTemplateSelector.cs b/Hyperbar.UI.Windows/ViewModelTemplateSelector.cs index eeb616b..249d511 100644 --- a/Hyperbar.UI.Windows/ViewModelTemplateSelector.cs +++ b/Hyperbar.UI.Windows/ViewModelTemplateSelector.cs @@ -1,17 +1,21 @@ -using Microsoft.UI.Xaml; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Markup; namespace Hyperbar.UI.Windows; -public class ViewModelTemplateSelector(IViewModelTemplateProvider descriptors) : +public class ViewModelTemplateSelector : DataTemplateSelector, IViewModelTemplateSelector { protected override DataTemplate SelectTemplateCore(object item) { - return descriptors.Get(item.GetType().Name) is Hyperbar.IViewModelTemplate descriptor - ? CreateDataTemplate(descriptor) + return item is IObservableViewModel observableViewModel && observableViewModel.ServiceProvider.GetService() + is IViewModelTemplateProvider viewModelTemplateProvider + ? viewModelTemplateProvider.Get(item.GetType().Name) is IViewModelTemplate viewModelTemplate + ? CreateDataTemplate(viewModelTemplate) + : new DataTemplate() : new DataTemplate(); } @@ -19,12 +23,12 @@ public class ViewModelTemplateSelector(IViewModelTemplateProvider descriptors) : DependencyObject container) => SelectTemplateCore(item); - private static DataTemplate CreateDataTemplate(Hyperbar.IViewModelTemplate descriptor) + private static DataTemplate CreateDataTemplate(IViewModelTemplate template) { string xamlString = @$" - + xmlns:ui=""using:{template.ViewType.Namespace}""> + "; return (DataTemplate)XamlReader.Load(xamlString); diff --git a/Hyperbar.Widget.MediaController.Windows/MediaControllerViewModel.cs b/Hyperbar.Widget.MediaController.Windows/MediaControllerViewModel.cs index 695c07c..d7d6fb3 100644 --- a/Hyperbar.Widget.MediaController.Windows/MediaControllerViewModel.cs +++ b/Hyperbar.Widget.MediaController.Windows/MediaControllerViewModel.cs @@ -14,7 +14,7 @@ public class MediaControllerViewModel : ISubscriber subscriber, IDisposer disposer) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) { - viewModelTemplateSelector = viewModelTemplateSelector; + ViewModelTemplateSelector = viewModelTemplateSelector; Add(); diff --git a/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetView.xaml b/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetView.xaml index 1259aab..9a54ac1 100644 --- a/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetView.xaml +++ b/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetView.xaml @@ -3,8 +3,9 @@ x:Class="Hyperbar.Widget.MediaController.Windows.MediaControllerWidgetView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> - safsfd + diff --git a/Hyperbar.Widget.Primary.Windows/PrimaryWidgetViewModel.cs b/Hyperbar.Widget.Primary.Windows/PrimaryWidgetViewModel.cs index 38cf022..e2b78db 100644 --- a/Hyperbar.Widget.Primary.Windows/PrimaryWidgetViewModel.cs +++ b/Hyperbar.Widget.Primary.Windows/PrimaryWidgetViewModel.cs @@ -1,6 +1,4 @@ -using Hyperbar.Widget; - -namespace Hyperbar.Widget.Primary.Windows; +namespace Hyperbar.Widget.Primary.Windows; [NotificationHandler(nameof(PrimaryWidgetViewModel))] public class PrimaryWidgetViewModel(IServiceProvider serviceProvider, diff --git a/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs b/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs index d2dd599..2d4a81d 100644 --- a/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs +++ b/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs @@ -17,9 +17,9 @@ public static class IServiceCollectionExtensions { services.AddSingleton(provider.GetRequiredService>()); services.AddSingleton(provider.GetRequiredService()); - - services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddScoped(); services.AddHandler(); diff --git a/Hyperbar.Widget.Windows/WidgetView.xaml.cs b/Hyperbar.Widget.Windows/WidgetView.xaml.cs index 6ad2772..92c46ef 100644 --- a/Hyperbar.Widget.Windows/WidgetView.xaml.cs +++ b/Hyperbar.Widget.Windows/WidgetView.xaml.cs @@ -1,4 +1,3 @@ -using Hyperbar.Widget; using Microsoft.UI.Xaml.Controls; namespace Hyperbar.Widget.Windows; diff --git a/Hyperbar.Widget/IServiceCollectionExtensions.cs b/Hyperbar.Widget/IServiceCollectionExtensions.cs index d07bc50..9045a92 100644 --- a/Hyperbar.Widget/IServiceCollectionExtensions.cs +++ b/Hyperbar.Widget/IServiceCollectionExtensions.cs @@ -10,6 +10,8 @@ public static class IServiceCollectionExtensions services.AddTransient(); services.AddTransient, WidgetFactory>(); + services.AddSingleton(); + services.AddHandler(); services.AddHandler(); services.AddHandler(); @@ -33,7 +35,7 @@ public static class IServiceCollectionExtensions services.AddKeyedTransient(typeof(IWidgetViewModel), key, contentType); services.TryAddKeyedTransient(key, (provider, key) => provider.GetService()!); - services.AddTransient(provider => new ViewModelTemplate { ViewModelType = contentType, TemplateType = templateType, Key = key }); + services.AddTransient(provider => new ViewModelTemplate { ViewModelType = contentType, ViewType = templateType, Key = key }); return services; } @@ -56,7 +58,7 @@ public static class IServiceCollectionExtensions services.AddTransient(provider => new ViewModelTemplate { ViewModelType = contentType, - TemplateType = templateType, Key = key }); + ViewType = templateType, Key = key }); return services; } diff --git a/Hyperbar.Widget/IWidgetHostCollection.cs b/Hyperbar.Widget/IWidgetHostCollection.cs new file mode 100644 index 0000000..9458c72 --- /dev/null +++ b/Hyperbar.Widget/IWidgetHostCollection.cs @@ -0,0 +1,7 @@ +namespace Hyperbar.Widget; + +public interface IWidgetHostCollection : + IEnumerable +{ + void Add(IWidgetHost widgetHost); +} diff --git a/Hyperbar.Widget/WidgetBuilder.cs b/Hyperbar.Widget/WidgetBuilder.cs index 736a379..c006c72 100644 --- a/Hyperbar.Widget/WidgetBuilder.cs +++ b/Hyperbar.Widget/WidgetBuilder.cs @@ -26,17 +26,17 @@ public class WidgetBuilder : .ConfigureServices((context, services) => { services.AddSingleton(); + services.AddScoped(provider => new ServiceFactory((type, parameters) => ActivatorUtilities.CreateInstance(provider, type, parameters!))); - services.AddSingleton(); - services.AddSingleton(); + services.AddScoped(); + services.AddScoped(); services.AddTransient(); services.AddTransient(); services.AddScoped(); - services.AddScoped(); services.AddHandler(); diff --git a/Hyperbar.Widget/WidgetExtensionHandler.cs b/Hyperbar.Widget/WidgetExtensionHandler.cs index ddccdeb..a06be42 100644 --- a/Hyperbar.Widget/WidgetExtensionHandler.cs +++ b/Hyperbar.Widget/WidgetExtensionHandler.cs @@ -7,16 +7,16 @@ public class WidgetExtensionHandler(IServiceProvider provider, IProxyServiceCollection typedServices) : INotificationHandler> { - public async Task Handle(Create notification, + public async Task Handle(Create args, CancellationToken cancellationToken) { - if(notification.Value is WidgetExtension widgetExtension) + if(args.Value is WidgetExtension widgetExtension) { IWidgetBuilder builder = widgetExtension.Widget.Create(); builder.ConfigureServices(args => { args.AddSingleton(widgetExtension.Assembly); - args.AddTransient(_ => provider.GetRequiredService>()); + args.AddTransient(_ => provider.GetRequiredService>()); args.AddRange(typedServices.Services); }); diff --git a/Hyperbar.Widget/WidgetHost.cs b/Hyperbar.Widget/WidgetHost.cs index f06b8b0..02a24b3 100644 --- a/Hyperbar.Widget/WidgetHost.cs +++ b/Hyperbar.Widget/WidgetHost.cs @@ -3,24 +3,13 @@ using Microsoft.Extensions.Hosting; namespace Hyperbar.Widget; -public sealed class WidgetHost : +public sealed class WidgetHost(IServiceProvider services, + IPublisher publisher, + IProxyService proxyPublisher, + IEnumerable hostedServices) : IWidgetHost { - private readonly IServiceProvider services; - private readonly IPublisher publisher; - private readonly IProxyService proxyMediator; - private readonly IEnumerable hostedServices; - - public WidgetHost(IServiceProvider services, - IPublisher publisher, - IProxyService proxyMediator, - IEnumerable hostedServices) - { - this.services = services; - this.publisher = publisher; - this.proxyMediator = proxyMediator; - this.hostedServices = hostedServices; - } + private readonly IPublisher publisher = publisher; public WidgetConfiguration Configuration => Services.GetRequiredService(); @@ -39,7 +28,7 @@ public sealed class WidgetHost : await service.StartAsync(cancellationToken); } - if (proxyMediator.Proxy is IMediator mediator) + if (proxyPublisher.Proxy is IPublisher publisher) { await publisher.PublishAsync(new Started(this), cancellationToken); diff --git a/Hyperbar.Widget/WidgetHostCollection.cs b/Hyperbar.Widget/WidgetHostCollection.cs new file mode 100644 index 0000000..2764940 --- /dev/null +++ b/Hyperbar.Widget/WidgetHostCollection.cs @@ -0,0 +1,21 @@ +using System.Collections; + +namespace Hyperbar.Widget; + +public class WidgetHostCollection : + IWidgetHostCollection + +{ + private readonly List hosts = []; + + public void Add(IWidgetHost host) + { + hosts.Add(host); + } + + public IEnumerator GetEnumerator() => + hosts.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => + hosts.GetEnumerator(); +} diff --git a/Hyperbar.Widget/WidgetHostHandler.cs b/Hyperbar.Widget/WidgetHostHandler.cs index 555c75f..7d6df95 100644 --- a/Hyperbar.Widget/WidgetHostHandler.cs +++ b/Hyperbar.Widget/WidgetHostHandler.cs @@ -2,14 +2,16 @@ namespace Hyperbar.Widget; -public class WidgetHostHandler : +public class WidgetHostHandler(IWidgetHostCollection widgetHosts) : INotificationHandler> { - public async Task Handle(Create notification, + public async Task Handle(Create args, CancellationToken cancellationToken) { - if (notification.Value is IWidgetHost host) + if (args.Value is IWidgetHost host) { + widgetHosts.Add(host); + if (host.Services.GetServices() is IEnumerable initializations) { diff --git a/Hyperbar.Windows/App.xaml.cs b/Hyperbar.Windows/App.xaml.cs index f1e8cf2..b8f32c9 100644 --- a/Hyperbar.Windows/App.xaml.cs +++ b/Hyperbar.Windows/App.xaml.cs @@ -43,8 +43,9 @@ public partial class App : services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddHandler(); services.AddConfiguration((AppConfiguration args) => @@ -65,8 +66,11 @@ public partial class App : services.AddContentTemplate(); services.AddContentTemplate(); + services.AddContentTemplate(); + services.AddContentTemplate("WidgetSettings"); + services.AddHandler(); services.AddTransient(); }) .Build(); diff --git a/Hyperbar.Windows/Hyperbar.Windows.csproj b/Hyperbar.Windows/Hyperbar.Windows.csproj index eb0a58b..e51a161 100644 --- a/Hyperbar.Windows/Hyperbar.Windows.csproj +++ b/Hyperbar.Windows/Hyperbar.Windows.csproj @@ -20,6 +20,7 @@ + @@ -58,6 +59,11 @@ + + + MSBuild:Compile + + MSBuild:Compile diff --git a/Hyperbar.Windows/PrimaryViewModel.cs b/Hyperbar.Windows/PrimaryViewModel.cs index 4cf4207..8cb0b54 100644 --- a/Hyperbar.Windows/PrimaryViewModel.cs +++ b/Hyperbar.Windows/PrimaryViewModel.cs @@ -18,5 +18,4 @@ public partial class PrimaryViewModel(IViewModelTemplateSelector viewModelTempla private int index = index; public IViewModelTemplateSelector ViewModelTemplateSelector => viewModelTemplateSelector; - } \ No newline at end of file diff --git a/Hyperbar.Windows/SettingsView.xaml b/Hyperbar.Windows/SettingsView.xaml index 7ff7ec5..32b3afb 100644 --- a/Hyperbar.Windows/SettingsView.xaml +++ b/Hyperbar.Windows/SettingsView.xaml @@ -2,7 +2,9 @@ + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:interactions="using:Microsoft.Xaml.Interactions.Core" + xmlns:interactivity="using:Microsoft.Xaml.Interactivity"> diff --git a/Hyperbar.Windows/WidgetNavigationView.xaml b/Hyperbar.Windows/WidgetNavigationView.xaml new file mode 100644 index 0000000..284720a --- /dev/null +++ b/Hyperbar.Windows/WidgetNavigationView.xaml @@ -0,0 +1,6 @@ + + diff --git a/Hyperbar.Windows/WidgetNavigationView.xaml.cs b/Hyperbar.Windows/WidgetNavigationView.xaml.cs new file mode 100644 index 0000000..da1c735 --- /dev/null +++ b/Hyperbar.Windows/WidgetNavigationView.xaml.cs @@ -0,0 +1,11 @@ +using Microsoft.UI.Xaml.Controls; + + +namespace Hyperbar.Windows; + +public sealed partial class WidgetNavigationView : + NavigationViewItem +{ + public WidgetNavigationView() => + InitializeComponent(); +} diff --git a/Hyperbar.Windows/WidgetNavigationViewModel.cs b/Hyperbar.Windows/WidgetNavigationViewModel.cs index 41708c1..141d3b8 100644 --- a/Hyperbar.Windows/WidgetNavigationViewModel.cs +++ b/Hyperbar.Windows/WidgetNavigationViewModel.cs @@ -1,4 +1,6 @@ -namespace Hyperbar.Windows; +using Hyperbar.UI.Windows; + +namespace Hyperbar.Windows; public class WidgetNavigationViewModel(IServiceProvider serviceProvider, IServiceFactory serviceFactory, @@ -6,6 +8,4 @@ public class WidgetNavigationViewModel(IServiceProvider serviceProvider, ISubscriber subscriber, IDisposer disposer, string text) : - NavigationViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer, text) -{ -} + NavigationViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer, text); \ No newline at end of file diff --git a/Hyperbar.Windows/WidgetNavigationViewModelEnumerator.cs b/Hyperbar.Windows/WidgetNavigationViewModelEnumerator.cs new file mode 100644 index 0000000..caf83c1 --- /dev/null +++ b/Hyperbar.Windows/WidgetNavigationViewModelEnumerator.cs @@ -0,0 +1,15 @@ +using System.Security.Policy; + +namespace Hyperbar.Windows; + +public class WidgetNavigationViewModelEnumerator(IServiceFactory serviceFactory, + IPublisher publisher) : + INotificationHandler> +{ + public async Task Handle(Enumerate args, + CancellationToken cancellationToken = default) + { + await publisher.PublishAsync(new Create(serviceFactory + .Create("fo")), nameof(WidgetSettingsNavigationViewModel), cancellationToken); + } +} diff --git a/Hyperbar.Windows/WidgetSettingsNavigationView.xaml b/Hyperbar.Windows/WidgetSettingsNavigationView.xaml index 0ce01d0..2f15878 100644 --- a/Hyperbar.Windows/WidgetSettingsNavigationView.xaml +++ b/Hyperbar.Windows/WidgetSettingsNavigationView.xaml @@ -6,10 +6,15 @@ xmlns:interactions="using:Microsoft.Xaml.Interactions.Core" xmlns:interactivity="using:Microsoft.Xaml.Interactivity" xmlns:ui="using:Hyperbar.UI.Windows" - Content="Widgets"> + Content="Widgets" + MenuItemsSource="{Binding}" + SelectsOnInvoked="False"> + + + diff --git a/Hyperbar.Windows/WidgetSettingsNavigationView.xaml.cs b/Hyperbar.Windows/WidgetSettingsNavigationView.xaml.cs index a4b17fb..fcda239 100644 --- a/Hyperbar.Windows/WidgetSettingsNavigationView.xaml.cs +++ b/Hyperbar.Windows/WidgetSettingsNavigationView.xaml.cs @@ -1,4 +1,3 @@ -using Hyperbar.Widget; using Microsoft.UI.Xaml.Controls; namespace Hyperbar.Windows; diff --git a/Hyperbar.Windows/WidgetSettingsNavigationViewModel.cs b/Hyperbar.Windows/WidgetSettingsNavigationViewModel.cs index a48ddee..fb48f77 100644 --- a/Hyperbar.Windows/WidgetSettingsNavigationViewModel.cs +++ b/Hyperbar.Windows/WidgetSettingsNavigationViewModel.cs @@ -1,9 +1,16 @@ -namespace Hyperbar.Windows; +using Hyperbar.UI.Windows; -public class WidgetSettingsNavigationViewModel(IServiceProvider serviceProvider, +namespace Hyperbar.Windows; + +[NotificationHandler(nameof(WidgetSettingsNavigationViewModel))] +public class WidgetSettingsNavigationViewModel(IViewModelTemplateSelector viewModelTemplateSelector, + IServiceProvider serviceProvider, IServiceFactory serviceFactory, IPublisher publisher, ISubscriber subscriber, IDisposer disposer, string text) : - NavigationViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer, text); + NavigationViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer, text) +{ + public IViewModelTemplateSelector ViewModelTemplateSelector => viewModelTemplateSelector; +} diff --git a/Hyperbar.Windows/WidgetSettingsViewModel.cs b/Hyperbar.Windows/WidgetSettingsViewModel.cs index 55211da..27831ed 100644 --- a/Hyperbar.Windows/WidgetSettingsViewModel.cs +++ b/Hyperbar.Windows/WidgetSettingsViewModel.cs @@ -2,18 +2,13 @@ namespace Hyperbar.Windows; -public class WidgetSettingsViewModel : - ObservableCollectionViewModel +public class WidgetSettingsViewModel(IViewModelTemplateSelector viewModelTemplateSelector, + IServiceProvider serviceProvider, + IServiceFactory serviceFactory, + IPublisher publisher, + ISubscriber subscriber, + IDisposer disposer) : + ObservableCollectionViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer) { - public WidgetSettingsViewModel(IViewModelTemplateSelector viewModelTemplateSelector, - IServiceProvider serviceProvider, - IServiceFactory serviceFactory, - IPublisher publisher, - ISubscriber subscriber, - IDisposer disposer) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer) - { - ViewModelTemplateSelector = viewModelTemplateSelector; - } - - public IViewModelTemplateSelector ViewModelTemplateSelector { get; } -} + public IViewModelTemplateSelector ViewModelTemplateSelector { get; } = viewModelTemplateSelector; +} \ No newline at end of file diff --git a/Hyperbar/IServiceCollectionExtensions.cs b/Hyperbar/IServiceCollectionExtensions.cs index ccabbbe..aa524c9 100644 --- a/Hyperbar/IServiceCollectionExtensions.cs +++ b/Hyperbar/IServiceCollectionExtensions.cs @@ -165,7 +165,7 @@ public static class IServiceCollectionExtensions services.AddTransient(provider => new ViewModelTemplate { ViewModelType = contentType, - TemplateType = templateType, + ViewType = templateType, Key = key }); @@ -184,8 +184,8 @@ public static class IServiceCollectionExtensions services.AddSingleton(); - services.AddSingleton>(provider => - new ProxyService(provider.GetRequiredService())); + services.AddSingleton>(provider => + new ProxyService(provider.GetRequiredService())); services.AddSingleton(); diff --git a/Hyperbar/IViewModelTemplate.cs b/Hyperbar/IViewModelTemplate.cs index f4ca5ee..b6002a8 100644 --- a/Hyperbar/IViewModelTemplate.cs +++ b/Hyperbar/IViewModelTemplate.cs @@ -4,7 +4,7 @@ public interface IViewModelTemplate { object Key { get; set; } - Type TemplateType { get; set; } + Type ViewType { get; set; } Type ViewModelType { get; set; } } \ No newline at end of file diff --git a/Hyperbar/NavigateHandler.cs b/Hyperbar/NavigateHandler.cs index a03554c..a2e0987 100644 --- a/Hyperbar/NavigateHandler.cs +++ b/Hyperbar/NavigateHandler.cs @@ -12,11 +12,10 @@ public class NavigateHandler(IServiceProvider provider, public async Task Handle(Navigate args, CancellationToken cancellationToken) { - if (viewModelTemplateProvider.Get(args.Name) is IViewModelTemplate viewModelTemplate) { - if (provider.GetRequiredKeyedService(viewModelTemplate.TemplateType, + if (provider.GetRequiredKeyedService(viewModelTemplate.ViewType, viewModelTemplate.Key) is object view && provider.GetRequiredKeyedService(viewModelTemplate.ViewModelType, viewModelTemplate.Key) is object viewModel) diff --git a/Hyperbar/ObservableCollectionViewModel.cs b/Hyperbar/ObservableCollectionViewModel.cs index d3b620a..b1cd765 100644 --- a/Hyperbar/ObservableCollectionViewModel.cs +++ b/Hyperbar/ObservableCollectionViewModel.cs @@ -68,7 +68,7 @@ public partial class ObservableCollectionViewModel : public IDisposer Disposer { get; private set; } public ICommand InitializeCommand => - new AsyncRelayCommand(CoreInitializeAsync); + new AsyncRelayCommand(CoreInitializeAsync); bool IList.IsFixedSize => false; diff --git a/Hyperbar/Publisher.cs b/Hyperbar/Publisher.cs index e5cdf57..3820401 100644 --- a/Hyperbar/Publisher.cs +++ b/Hyperbar/Publisher.cs @@ -43,8 +43,7 @@ public class Publisher(ISubscriptionManager subscriptionManager, List handlers = provider.GetServices(typeof(INotificationHandler<>) .MakeGenericType(notificationType)).ToList(); - foreach (object? handler in subscriptionManager.GetHandlers(notificationType, - $"{key?.ToString()}:{notificationType}")) + foreach (object? handler in subscriptionManager.GetHandlers(notificationType, key)) { handlers.Add(handler); } diff --git a/Hyperbar/SubscriptionManager.cs b/Hyperbar/SubscriptionManager.cs index e6bfe5d..98161aa 100644 --- a/Hyperbar/SubscriptionManager.cs +++ b/Hyperbar/SubscriptionManager.cs @@ -7,6 +7,7 @@ public class SubscriptionManager(SubscriptionCollection subscriptions) : { public IEnumerable GetHandlers(Type notificationType, object key) { + var d = subscriptions; if (subscriptions.TryGetValue($"{key?.ToString()}:{notificationType}", out List? subscribers)) { diff --git a/Hyperbar/ViewModelTemplate.cs b/Hyperbar/ViewModelTemplate.cs index ef3a475..6fd16a9 100644 --- a/Hyperbar/ViewModelTemplate.cs +++ b/Hyperbar/ViewModelTemplate.cs @@ -5,7 +5,7 @@ public record ViewModelTemplate : { public required Type ViewModelType { get; set; } - public required Type TemplateType { get; set; } + public required Type ViewType { get; set; } public required object Key { get; set; } } \ No newline at end of file diff --git a/Hyperbar/ViewModelTemplateProvider.cs b/Hyperbar/ViewModelTemplateProvider.cs index 45241ca..473df81 100644 --- a/Hyperbar/ViewModelTemplateProvider.cs +++ b/Hyperbar/ViewModelTemplateProvider.cs @@ -1,4 +1,5 @@ namespace Hyperbar; + public class ViewModelTemplateProvider(IEnumerable viewModelTemplates) : IViewModelTemplateProvider {