diff --git a/Hyperbar.UI.Windows/Hyperbar.UI.Windows.csproj b/Hyperbar.UI.Windows/Hyperbar.UI.Windows.csproj
index 52c8d48..ec11b2b 100644
--- a/Hyperbar.UI.Windows/Hyperbar.UI.Windows.csproj
+++ b/Hyperbar.UI.Windows/Hyperbar.UI.Windows.csproj
@@ -11,6 +11,7 @@
+
diff --git a/Hyperbar.UI.Windows/IViewModelTemplate.cs b/Hyperbar.UI.Windows/IViewModelTemplate.cs
new file mode 100644
index 0000000..fa34338
--- /dev/null
+++ b/Hyperbar.UI.Windows/IViewModelTemplate.cs
@@ -0,0 +1,6 @@
+namespace Hyperbar.UI.Windows;
+
+public interface IViewModelTemplate
+{
+
+}
diff --git a/Hyperbar.UI.Windows/NavigateAction.cs b/Hyperbar.UI.Windows/NavigateAction.cs
new file mode 100644
index 0000000..eb7160b
--- /dev/null
+++ b/Hyperbar.UI.Windows/NavigateAction.cs
@@ -0,0 +1,34 @@
+using Microsoft.UI.Xaml;
+using Microsoft.Xaml.Interactivity;
+
+namespace Hyperbar.UI.Windows;
+
+public sealed class NavigateAction :
+ DependencyObject,
+ IAction
+{
+ public static readonly DependencyProperty PathProperty =
+ DependencyProperty.Register(nameof(Path),
+ typeof(string), typeof(NavigateAction),
+ new PropertyMetadata(null));
+
+ public string Path
+ {
+ get => (string)GetValue(PathProperty);
+ set => SetValue(PathProperty, value);
+ }
+
+ public object Execute(object sender, object parameter)
+ {
+ if (sender is FrameworkElement frameworkElement)
+ {
+ if (frameworkElement.DataContext is IObservableViewModel observableViewModel)
+ {
+ observableViewModel.Mediator.PublishAsync(new Navigate(Path))
+ .GetAwaiter().GetResult();
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/Hyperbar.UI.Windows/ViewModelTemplate.cs b/Hyperbar.UI.Windows/ViewModelTemplate.cs
new file mode 100644
index 0000000..01fe947
--- /dev/null
+++ b/Hyperbar.UI.Windows/ViewModelTemplate.cs
@@ -0,0 +1,32 @@
+using Microsoft.UI.Xaml;
+using Microsoft.UI.Xaml.Controls;
+using Microsoft.UI.Xaml.Markup;
+
+namespace Hyperbar.UI.Windows;
+
+public class ViewModelTemplate(IViewModelTemplateDescriptorProvider descriptors) :
+ DataTemplateSelector,
+ IViewModelTemplate
+{
+ protected override DataTemplate SelectTemplateCore(object item)
+ {
+ return descriptors.Get(item.GetType().Name) is IViewModelTemplateDescriptor descriptor
+ ? CreateDataTemplate(descriptor)
+ : new DataTemplate();
+ }
+
+ protected override DataTemplate SelectTemplateCore(object item,
+ DependencyObject container) =>
+ SelectTemplateCore(item);
+
+ private DataTemplate CreateDataTemplate(IViewModelTemplateDescriptor descriptor)
+ {
+ string xamlString = @$"
+
+
+ ";
+
+ return (DataTemplate)XamlReader.Load(xamlString);
+ }
+}
diff --git a/Hyperbar.UI.Windows/ViewModelTemplatePresenter.cs b/Hyperbar.UI.Windows/ViewModelTemplatePresenter.cs
deleted file mode 100644
index 2462c27..0000000
--- a/Hyperbar.UI.Windows/ViewModelTemplatePresenter.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using Microsoft.UI.Xaml;
-using Microsoft.UI.Xaml.Controls;
-
-namespace Hyperbar.UI.Windows;
-
-public class ViewModelTemplatePresenter :
- ContentPresenter
-{
- public ViewModelTemplatePresenter()
- {
- DataContextChanged += OnDataContextChanged;
- }
-
- private void OnDataContextChanged(FrameworkElement sender,
- DataContextChangedEventArgs args)
- {
- //if (DataContext is IViewModelTemplate templatedViewModel)
- //{
- // Content = templatedViewModel.TemplateFactory
- // .Create(DataContext.GetType().Name);
- //}
- }
-}
\ No newline at end of file
diff --git a/Hyperbar.UI.Windows/ViewModelTemplateSelector.cs b/Hyperbar.UI.Windows/ViewModelTemplateSelector.cs
deleted file mode 100644
index ecf29ce..0000000
--- a/Hyperbar.UI.Windows/ViewModelTemplateSelector.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.UI.Xaml;
-using Microsoft.UI.Xaml.Controls;
-using Microsoft.UI.Xaml.Markup;
-
-namespace Hyperbar.UI.Windows;
-
-public class ViewModelTemplate :
- MarkupExtension
-{
- protected override object ProvideValue(IXamlServiceProvider serviceProvider) =>
- new ViewModelTemplateSelector();
-
- internal class ViewModelTemplateSelector :
- DataTemplateSelector
- {
- protected override DataTemplate SelectTemplateCore(object item) =>
- item is IObservableViewModel observableViewModel &&
- observableViewModel.ServiceProvider.GetService()
- is ViewModelTemplateDescriptorProvider descriptors &&
- descriptors.Get(item.GetType().Name) is IViewModelTemplateDescriptor descriptor
- ? CreateDataTemplate(descriptor)
- : new DataTemplate();
-
- protected override DataTemplate SelectTemplateCore(object item,
- DependencyObject container) =>
- SelectTemplateCore(item);
-
- private DataTemplate CreateDataTemplate(IViewModelTemplateDescriptor descriptor)
- {
- string xamlString = @$"
-
-
- ";
-
- return (DataTemplate)XamlReader.Load(xamlString);
- }
- }
-}
diff --git a/Hyperbar.UI.Windows/WindowHandler.cs b/Hyperbar.UI.Windows/WindowHandler.cs
index 46f3054..31bad69 100644
--- a/Hyperbar.UI.Windows/WindowHandler.cs
+++ b/Hyperbar.UI.Windows/WindowHandler.cs
@@ -1,7 +1,19 @@
using Microsoft.UI.Xaml;
+using Microsoft.UI.Xaml.Controls;
namespace Hyperbar.UI.Windows;
+public class FrameHandler :
+ INavigationHandler
+{
+ public Task Handle(Navigate args,
+ CancellationToken cancellationToken = default)
+ {
+
+ return Task.CompletedTask;
+ }
+}
+
public class WindowHandler :
INavigationHandler
{
@@ -10,9 +22,19 @@ public class WindowHandler :
{
if (args.Template is Window window)
{
- if (window.Content is FrameworkElement frameworkElement)
+ if (window.Content is FrameworkElement content)
{
- frameworkElement.DataContext = args.Content;
+ void HandleClosed(object sender, WindowEventArgs args)
+ {
+ window.Closed -= HandleClosed;
+ if (content.DataContext is IObservableViewModel observableViewModel)
+ {
+ observableViewModel.Dispose();
+ }
+ }
+
+ window.Closed += HandleClosed;
+ content.DataContext = args.Content;
}
window.Activate();
diff --git a/Hyperbar.Widget.MediaController.Windows/MediaButtonViewModel.cs b/Hyperbar.Widget.MediaController.Windows/MediaButtonViewModel.cs
index 4fac719..160945f 100644
--- a/Hyperbar.Widget.MediaController.Windows/MediaButtonViewModel.cs
+++ b/Hyperbar.Widget.MediaController.Windows/MediaButtonViewModel.cs
@@ -7,9 +7,8 @@ public partial class MediaButtonViewModel(IServiceProvider service
IServiceFactory serviceFactory,
IMediator mediator,
IDisposer disposer,
- IViewModelTemplateFactory templateFactory,
IRelayCommand invokeCommand) :
- WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer, templateFactory),
+ WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer),
INotificationHandler>>,
IMediaButtonViewModel
{
diff --git a/Hyperbar.Widget.MediaController.Windows/MediaControllerView.xaml b/Hyperbar.Widget.MediaController.Windows/MediaControllerView.xaml
index d04e50d..31df3e2 100644
--- a/Hyperbar.Widget.MediaController.Windows/MediaControllerView.xaml
+++ b/Hyperbar.Widget.MediaController.Windows/MediaControllerView.xaml
@@ -7,7 +7,7 @@
diff --git a/Hyperbar.Widget.MediaController.Windows/MediaControllerViewModel.cs b/Hyperbar.Widget.MediaController.Windows/MediaControllerViewModel.cs
index ed1cb29..877b618 100644
--- a/Hyperbar.Widget.MediaController.Windows/MediaControllerViewModel.cs
+++ b/Hyperbar.Widget.MediaController.Windows/MediaControllerViewModel.cs
@@ -1,4 +1,5 @@
using CommunityToolkit.Mvvm.Input;
+using Hyperbar.UI.Windows;
namespace Hyperbar.Widget.MediaController.Windows;
@@ -6,17 +7,17 @@ namespace Hyperbar.Widget.MediaController.Windows;
public class MediaControllerViewModel :
ObservableCollectionViewModel
{
- public MediaControllerViewModel(IViewModelTemplateFactory templateFactory,
+ public MediaControllerViewModel(IViewModelTemplate template,
IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IMediator mediator,
IDisposer disposer) : base(serviceProvider, serviceFactory, mediator, disposer)
{
- TemplateFactory = templateFactory;
+ Template = template;
Add();
- Add>(new RelayCommand(async () =>
+ Add>(new RelayCommand(async () =>
await mediator.PublishAsync>()));
Add>(new RelayCommand(async () =>
@@ -26,5 +27,5 @@ public class MediaControllerViewModel :
await mediator.PublishAsync>()));
}
- public IViewModelTemplateFactory TemplateFactory { get; set; }
+ public IViewModelTemplate Template { get; }
}
\ No newline at end of file
diff --git a/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetView.xaml b/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetView.xaml
index efb1c43..291e3b3 100644
--- a/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetView.xaml
+++ b/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetView.xaml
@@ -2,10 +2,9 @@
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
diff --git a/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetViewModel.cs b/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetViewModel.cs
index bc494cc..98ddf09 100644
--- a/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetViewModel.cs
+++ b/Hyperbar.Widget.MediaController.Windows/MediaControllerWidgetViewModel.cs
@@ -1,6 +1,8 @@
-namespace Hyperbar.Widget.MediaController.Windows;
+using Hyperbar.UI.Windows;
-public class MediaControllerWidgetViewModel(IViewModelTemplateFactory templateFactory,
+namespace Hyperbar.Widget.MediaController.Windows;
+
+public class MediaControllerWidgetViewModel(IViewModelTemplate template,
IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IMediator mediator,
@@ -9,5 +11,5 @@ public class MediaControllerWidgetViewModel(IViewModelTemplateFactory templateFa
ObservableCollectionViewModel(serviceProvider, serviceFactory, mediator, disposer, items),
IWidgetViewModel
{
- public IViewModelTemplateFactory TemplateFactory => templateFactory;
+ public IViewModelTemplate Template => template;
}
\ No newline at end of file
diff --git a/Hyperbar.Widget.MediaController.Windows/MediaInformationViewModel.cs b/Hyperbar.Widget.MediaController.Windows/MediaInformationViewModel.cs
index 03d67b2..8222829 100644
--- a/Hyperbar.Widget.MediaController.Windows/MediaInformationViewModel.cs
+++ b/Hyperbar.Widget.MediaController.Windows/MediaInformationViewModel.cs
@@ -5,9 +5,8 @@ namespace Hyperbar.Widget.MediaController.Windows;
public partial class MediaInformationViewModel(IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IMediator mediator,
- IDisposer disposer,
- IViewModelTemplateFactory templateFactory) :
- WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer, templateFactory),
+ IDisposer disposer) :
+ WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer),
INotificationHandler>
{
[ObservableProperty]
diff --git a/Hyperbar.Widget.Primary.Windows/PrimaryWidgetViewModel.cs b/Hyperbar.Widget.Primary.Windows/PrimaryWidgetViewModel.cs
index 045d7a6..6cc2ca1 100644
--- a/Hyperbar.Widget.Primary.Windows/PrimaryWidgetViewModel.cs
+++ b/Hyperbar.Widget.Primary.Windows/PrimaryWidgetViewModel.cs
@@ -3,13 +3,9 @@
namespace Hyperbar.Widget.Primary.Windows;
[NotificationHandler(nameof(PrimaryWidgetViewModel))]
-public class PrimaryWidgetViewModel(IViewModelTemplateFactory templateFactory,
- IServiceProvider serviceProvider,
+public class PrimaryWidgetViewModel(IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IMediator mediator,
IDisposer disposer) :
ObservableCollectionViewModel(serviceProvider, serviceFactory, mediator, disposer),
- IWidgetViewModel
-{
- public IViewModelTemplateFactory TemplateFactory => templateFactory;
-}
\ No newline at end of file
+ IWidgetViewModel;
\ No newline at end of file
diff --git a/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs b/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs
index 6de350d..d4ece2f 100644
--- a/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs
+++ b/Hyperbar.Widget.Windows/IServiceCollectionExtensions.cs
@@ -2,7 +2,6 @@
using Hyperbar.UI.Windows;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml.Markup;
-using System.Collections.Generic;
namespace Hyperbar.Widget.Windows;
@@ -19,8 +18,8 @@ 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 b/Hyperbar.Widget.Windows/WidgetView.xaml
index 40e992c..f28a283 100644
--- a/Hyperbar.Widget.Windows/WidgetView.xaml
+++ b/Hyperbar.Widget.Windows/WidgetView.xaml
@@ -7,7 +7,7 @@
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:ui="using:Hyperbar.UI.Windows">
-
+
diff --git a/Hyperbar.Widget/WidgetButtonViewModel.cs b/Hyperbar.Widget/WidgetButtonViewModel.cs
index a729d9b..3f93d15 100644
--- a/Hyperbar.Widget/WidgetButtonViewModel.cs
+++ b/Hyperbar.Widget/WidgetButtonViewModel.cs
@@ -8,11 +8,10 @@ public partial class WidgetButtonViewModel(IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IMediator mediator,
IDisposer disposer,
- IViewModelTemplateFactory templateFactory,
Guid id,
string? text = null,
string? icon = null,
- RelayCommand? invokeCommand = null) : WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer, templateFactory)
+ RelayCommand? invokeCommand = null) : WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer)
{
[ObservableProperty]
private string? icon = icon;
diff --git a/Hyperbar.Widget/WidgetComponentViewModel.cs b/Hyperbar.Widget/WidgetComponentViewModel.cs
index a2731c3..7ef11e8 100644
--- a/Hyperbar.Widget/WidgetComponentViewModel.cs
+++ b/Hyperbar.Widget/WidgetComponentViewModel.cs
@@ -8,20 +8,16 @@ public partial class WidgetComponentViewModel :
IServiceFactory serviceFactory,
IMediator mediator,
IDisposer disposer,
- IViewModelTemplateFactory templateFactory,
IEnumerable items) : base(serviceProvider, serviceFactory, mediator, disposer, items)
{
- TemplateFactory = templateFactory;
+
}
public WidgetComponentViewModel(IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IMediator mediator,
- IDisposer disposer,
- IViewModelTemplateFactory templateFactory) : base(serviceProvider, serviceFactory, mediator, disposer)
+ IDisposer disposer) : base(serviceProvider, serviceFactory, mediator, disposer)
{
- TemplateFactory = templateFactory;
- }
- public IViewModelTemplateFactory TemplateFactory { get; private set; }
+ }
}
\ No newline at end of file
diff --git a/Hyperbar.Widget/WidgetMenuViewModel.cs b/Hyperbar.Widget/WidgetMenuViewModel.cs
index b5dc32b..bd893bc 100644
--- a/Hyperbar.Widget/WidgetMenuViewModel.cs
+++ b/Hyperbar.Widget/WidgetMenuViewModel.cs
@@ -8,11 +8,10 @@ public partial class WidgetMenuViewModel(IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IMediator mediator,
IDisposer disposer,
- IViewModelTemplateFactory templateFactory,
Guid id = default,
string? text = null,
string? icon = null,
- RelayCommand? command = null) : WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer, templateFactory)
+ RelayCommand? command = null) : WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer)
{
[ObservableProperty]
private IRelayCommand? click = command;
diff --git a/Hyperbar.Widget/WidgetSplitButtonViewModel.cs b/Hyperbar.Widget/WidgetSplitButtonViewModel.cs
index 406e61e..4213d4e 100644
--- a/Hyperbar.Widget/WidgetSplitButtonViewModel.cs
+++ b/Hyperbar.Widget/WidgetSplitButtonViewModel.cs
@@ -8,12 +8,11 @@ public partial class WidgetSplitButtonViewModel(IServiceProvider serviceProvider
IServiceFactory serviceFactory,
IMediator mediator,
IDisposer disposer,
- IViewModelTemplateFactory templateFactory,
IEnumerable items,
Guid id = default,
string? text = null,
string? icon = null,
- RelayCommand? command = null) : WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer, templateFactory, items)
+ RelayCommand? command = null) : WidgetComponentViewModel(serviceProvider, serviceFactory, mediator, disposer, items)
{
[ObservableProperty]
private IRelayCommand? click = command;
diff --git a/Hyperbar.Windows/App.xaml.cs b/Hyperbar.Windows/App.xaml.cs
index 67107e6..27e8d32 100644
--- a/Hyperbar.Windows/App.xaml.cs
+++ b/Hyperbar.Windows/App.xaml.cs
@@ -37,9 +37,9 @@ public partial class App :
services.AddHostedService();
services.AddSingleton(new Dispatcher(DispatcherQueue.GetForCurrentThread()));
-
+
+ services.AddTransient();
services.AddTransient();
- services.AddTransient();
services.AddHandler();
services.AddConfiguration(args =>
diff --git a/Hyperbar.Windows/ApplicationBarView.xaml b/Hyperbar.Windows/ApplicationBarView.xaml
index e3aca94..71c71f1 100644
--- a/Hyperbar.Windows/ApplicationBarView.xaml
+++ b/Hyperbar.Windows/ApplicationBarView.xaml
@@ -17,7 +17,7 @@
diff --git a/Hyperbar.Windows/ApplicationBarViewModel.cs b/Hyperbar.Windows/ApplicationBarViewModel.cs
index af7de74..77bd9a6 100644
--- a/Hyperbar.Windows/ApplicationBarViewModel.cs
+++ b/Hyperbar.Windows/ApplicationBarViewModel.cs
@@ -1,20 +1,23 @@
-namespace Hyperbar.Widget;
+using Hyperbar.UI.Windows;
+
+namespace Hyperbar.Widget;
+
[NotificationHandler(nameof(IWidgetHostViewModel))]
public partial class ApplicationBarViewModel :
ObservableCollectionViewModel
{
- public ApplicationBarViewModel(IViewModelTemplateFactory templateFactory,
+ public ApplicationBarViewModel(IViewModelTemplate template,
IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IMediator mediator,
IDisposer disposer) : base(serviceProvider, serviceFactory, mediator, disposer)
{
- TemplateFactory = templateFactory;
+ Template = template;
Add(0);
Add(1);
}
- public IViewModelTemplateFactory TemplateFactory { get; }
+ public IViewModelTemplate Template { get; }
}
\ No newline at end of file
diff --git a/Hyperbar.Windows/GeneralSettingsNavigationView.xaml b/Hyperbar.Windows/GeneralSettingsNavigationView.xaml
index 68d1872..9e0e388 100644
--- a/Hyperbar.Windows/GeneralSettingsNavigationView.xaml
+++ b/Hyperbar.Windows/GeneralSettingsNavigationView.xaml
@@ -3,4 +3,13 @@
x:Class="Hyperbar.Windows.GeneralSettingsNavigationView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Content="General" />
+ xmlns:interactions="using:Microsoft.Xaml.Interactions.Core"
+ xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
+ xmlns:ui="using:Hyperbar.UI.Windows"
+ Content="General">
+
+
+
+
+
+
diff --git a/Hyperbar.Windows/GeneralSettingsNavigationView.xaml.cs b/Hyperbar.Windows/GeneralSettingsNavigationView.xaml.cs
index d4fc51c..abad6e3 100644
--- a/Hyperbar.Windows/GeneralSettingsNavigationView.xaml.cs
+++ b/Hyperbar.Windows/GeneralSettingsNavigationView.xaml.cs
@@ -2,9 +2,12 @@ using Microsoft.UI.Xaml.Controls;
namespace Hyperbar.Windows;
-public sealed partial class GeneralSettingsNavigationView :
+public partial class GeneralSettingsNavigationView :
NavigationViewItem
{
public GeneralSettingsNavigationView() =>
InitializeComponent();
+
+ protected GeneralSettingsNavigationViewModel ViewModel =>
+ (GeneralSettingsNavigationViewModel)DataContext;
}
diff --git a/Hyperbar.Windows/PrimaryView.xaml b/Hyperbar.Windows/PrimaryView.xaml
index 410330d..28581af 100644
--- a/Hyperbar.Windows/PrimaryView.xaml
+++ b/Hyperbar.Windows/PrimaryView.xaml
@@ -6,7 +6,7 @@
xmlns:ui="using:Hyperbar.UI.Windows">
diff --git a/Hyperbar.Windows/PrimaryViewModel.cs b/Hyperbar.Windows/PrimaryViewModel.cs
index 5781f40..6915cbc 100644
--- a/Hyperbar.Windows/PrimaryViewModel.cs
+++ b/Hyperbar.Windows/PrimaryViewModel.cs
@@ -1,9 +1,10 @@
using CommunityToolkit.Mvvm.ComponentModel;
+using Hyperbar.UI.Windows;
namespace Hyperbar.Widget;
[NotificationHandler(nameof(IWidgetHostViewModel))]
-public partial class PrimaryViewModel(IViewModelTemplateFactory templateFactory,
+public partial class PrimaryViewModel(IViewModelTemplate template,
IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IMediator mediator,
@@ -15,5 +16,6 @@ public partial class PrimaryViewModel(IViewModelTemplateFactory templateFactory,
[ObservableProperty]
private int index = index;
- public IViewModelTemplateFactory TemplateFactory => templateFactory;
+ public IViewModelTemplate Template => template;
+
}
\ No newline at end of file
diff --git a/Hyperbar.Windows/SecondaryView.xaml b/Hyperbar.Windows/SecondaryView.xaml
index 6b24637..4d5d1ef 100644
--- a/Hyperbar.Windows/SecondaryView.xaml
+++ b/Hyperbar.Windows/SecondaryView.xaml
@@ -5,7 +5,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ui="using:Hyperbar.UI.Windows">
-
+
diff --git a/Hyperbar.Windows/SecondaryViewModel.cs b/Hyperbar.Windows/SecondaryViewModel.cs
index e44b7b3..e9190e3 100644
--- a/Hyperbar.Windows/SecondaryViewModel.cs
+++ b/Hyperbar.Windows/SecondaryViewModel.cs
@@ -1,4 +1,5 @@
using CommunityToolkit.Mvvm.ComponentModel;
+using Hyperbar.UI.Windows;
using Hyperbar.Windows;
namespace Hyperbar.Widget;
@@ -9,18 +10,19 @@ public partial class SecondaryViewModel :
[ObservableProperty]
private int index;
- public SecondaryViewModel(IViewModelTemplateFactory templateFactory,
+ public SecondaryViewModel(IViewModelTemplate template,
IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IMediator mediator,
IDisposer disposer,
int index) : base(serviceProvider, serviceFactory, mediator, disposer)
- {
- TemplateFactory = templateFactory;
+ {
+ Template = template;
this.index = index;
Add();
}
- public IViewModelTemplateFactory TemplateFactory { get; }
+ public IViewModelTemplate Template { get; }
+
}
\ No newline at end of file
diff --git a/Hyperbar.Windows/SettingsButtonView.xaml b/Hyperbar.Windows/SettingsButtonView.xaml
index e99f889..7e1292d 100644
--- a/Hyperbar.Windows/SettingsButtonView.xaml
+++ b/Hyperbar.Windows/SettingsButtonView.xaml
@@ -2,7 +2,10 @@
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:interactions="using:Microsoft.Xaml.Interactions.Core"
+ xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
+ xmlns:windows="using:Hyperbar.UI.Windows">
@@ -18,8 +21,13 @@
Width="{ThemeResource ButtonWidth}"
Height="{ThemeResource ButtonHeight}"
Padding="{ThemeResource ButtonPadding}"
- Command="{x:Bind ViewModel.InvokeCommand}"
Content=""
FontFamily="{ThemeResource SymbolThemeFontFamily}"
- FontSize="16" />
+ FontSize="16">
+
+
+
+
+
+
diff --git a/Hyperbar.Windows/SettingsButtonViewModel.cs b/Hyperbar.Windows/SettingsButtonViewModel.cs
index 02ec649..2079251 100644
--- a/Hyperbar.Windows/SettingsButtonViewModel.cs
+++ b/Hyperbar.Windows/SettingsButtonViewModel.cs
@@ -1,24 +1,13 @@
-using CommunityToolkit.Mvvm.ComponentModel;
-using CommunityToolkit.Mvvm.Input;
+using Hyperbar.UI.Windows;
namespace Hyperbar.Windows;
-public partial class SettingsButtonViewModel :
- ObservableViewModel
+public partial class SettingsButtonViewModel(IViewModelTemplate template,
+ IServiceProvider serviceProvider,
+ IServiceFactory serviceFactory,
+ IMediator mediator,
+ IDisposer disposer) :
+ ObservableViewModel(serviceProvider, serviceFactory, mediator, disposer)
{
- [ObservableProperty]
- private IRelayCommand? invokeCommand;
-
- public SettingsButtonViewModel(IViewModelTemplateFactory templateFactory,
- IServiceProvider serviceProvider,
- IServiceFactory serviceFactory,
- IMediator mediator,
- IDisposer disposer) : base(serviceProvider, serviceFactory, mediator, disposer)
- {
- TemplateFactory = templateFactory;
- InvokeCommand = new AsyncRelayCommand(async () =>
- await mediator.PublishAsync(new Navigate("Settings")));
- }
-
- public IViewModelTemplateFactory TemplateFactory { get; }
-}
+ public IViewModelTemplate Template => template;
+}
\ No newline at end of file
diff --git a/Hyperbar.Windows/SettingsView.xaml b/Hyperbar.Windows/SettingsView.xaml
index f81082e..ae1d36c 100644
--- a/Hyperbar.Windows/SettingsView.xaml
+++ b/Hyperbar.Windows/SettingsView.xaml
@@ -2,9 +2,7 @@
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
@@ -12,6 +10,6 @@
IsBackButtonVisible="Collapsed"
IsPaneToggleButtonVisible="False"
IsSettingsVisible="False"
- MenuItemTemplateSelector="{ui:ViewModelTemplate}"
+ MenuItemTemplateSelector="{Binding Template}"
MenuItemsSource="{x:Bind ViewModel, Mode=OneWay}" />
-
+
\ No newline at end of file
diff --git a/Hyperbar.Windows/SettingsViewModel.cs b/Hyperbar.Windows/SettingsViewModel.cs
index e1927cf..0a5111d 100644
--- a/Hyperbar.Windows/SettingsViewModel.cs
+++ b/Hyperbar.Windows/SettingsViewModel.cs
@@ -1,19 +1,21 @@
-namespace Hyperbar.Windows;
+using Hyperbar.UI.Windows;
+
+namespace Hyperbar.Windows;
public partial class SettingsViewModel :
ObservableCollectionViewModel
{
- public SettingsViewModel(IServiceProvider serviceProvider,
+ public SettingsViewModel(IViewModelTemplate template,
+ IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IMediator mediator,
- IDisposer disposer,
- IViewModelTemplateFactory templateFactory) : base(serviceProvider, serviceFactory, mediator, disposer)
+ IDisposer disposer) : base(serviceProvider, serviceFactory, mediator, disposer)
{
+ Template = template;
+
Add("General");
Add("Widgets");
-
- TemplateFactory = templateFactory;
}
- public IViewModelTemplateFactory TemplateFactory { get; }
+ public IViewModelTemplate Template { get; }
}
diff --git a/Hyperbar.Windows/WidgetSettingsNavigationView.xaml b/Hyperbar.Windows/WidgetSettingsNavigationView.xaml
index 404d0e0..bd74876 100644
--- a/Hyperbar.Windows/WidgetSettingsNavigationView.xaml
+++ b/Hyperbar.Windows/WidgetSettingsNavigationView.xaml
@@ -3,4 +3,13 @@
x:Class="Hyperbar.Windows.WidgetSettingsNavigationView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- Content="Widgets" />
+ xmlns:interactions="using:Microsoft.Xaml.Interactions.Core"
+ xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
+ xmlns:ui="using:Hyperbar.UI.Windows"
+ Content="Widgets">
+
+
+
+
+
+
diff --git a/Hyperbar.Windows/WidgetSettingsNavigationView.xaml.cs b/Hyperbar.Windows/WidgetSettingsNavigationView.xaml.cs
index 3573a21..a4b17fb 100644
--- a/Hyperbar.Windows/WidgetSettingsNavigationView.xaml.cs
+++ b/Hyperbar.Windows/WidgetSettingsNavigationView.xaml.cs
@@ -1,10 +1,14 @@
+using Hyperbar.Widget;
using Microsoft.UI.Xaml.Controls;
namespace Hyperbar.Windows;
-public sealed partial class WidgetSettingsNavigationView :
+public partial class WidgetSettingsNavigationView :
NavigationViewItem
{
public WidgetSettingsNavigationView() =>
InitializeComponent();
+
+ protected WidgetSettingsNavigationViewModel ViewModel =>
+ (WidgetSettingsNavigationViewModel)DataContext;
}
diff --git a/Hyperbar/Lifecycles/NavigateHandler.cs b/Hyperbar/Lifecycles/NavigateHandler.cs
index d89e049..c249d07 100644
--- a/Hyperbar/Lifecycles/NavigateHandler.cs
+++ b/Hyperbar/Lifecycles/NavigateHandler.cs
@@ -5,7 +5,7 @@ namespace Hyperbar;
public class NavigateHandler :
INotificationHandler
{
- private readonly IEnumerable contentTemplateDescriptors;
+ private readonly IViewModelTemplateDescriptorProvider contentTemplateDescriptors;
private readonly IServiceProvider provider;
private readonly IMediator mediator;
private readonly IEnumerable navigationDescriptors;
@@ -13,7 +13,7 @@ public class NavigateHandler :
public NavigateHandler(IServiceProvider provider,
IMediator mediator,
IEnumerable navigationDescriptors,
- IEnumerable contentTemplateDescriptors)
+ IViewModelTemplateDescriptorProvider contentTemplateDescriptors)
{
this.provider = provider;
this.mediator = mediator;
@@ -24,7 +24,7 @@ public class NavigateHandler :
public async Task Handle(Navigate args,
CancellationToken cancellationToken)
{
- if (contentTemplateDescriptors.FirstOrDefault(x => x.Key == args.Key)
+ if (contentTemplateDescriptors.Get(args.Key)
is IViewModelTemplateDescriptor contentTemplateDescriptor)
{
if (navigationDescriptors.FirstOrDefault(x => contentTemplateDescriptor.TemplateType == x.Type ||
diff --git a/Hyperbar/Templates/IViewModelTemplateFactory.cs b/Hyperbar/Templates/IViewModelTemplateFactory.cs
deleted file mode 100644
index d46f917..0000000
--- a/Hyperbar/Templates/IViewModelTemplateFactory.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace Hyperbar;
-
-public interface IViewModelTemplateFactory
-{
- object? Create(object key);
-}
\ No newline at end of file
diff --git a/Hyperbar/Templates/ViewModelTemplateDescriptorProvider.cs b/Hyperbar/Templates/ViewModelTemplateDescriptorProvider.cs
index f80fc22..166c790 100644
--- a/Hyperbar/Templates/ViewModelTemplateDescriptorProvider.cs
+++ b/Hyperbar/Templates/ViewModelTemplateDescriptorProvider.cs
@@ -5,7 +5,7 @@ public class ViewModelTemplateDescriptorProvider(IEnumerable x.Key == key)
+ if (descriptors.FirstOrDefault(x => x.Key.Equals(key))
is IViewModelTemplateDescriptor descriptor)
{
return descriptor;
diff --git a/Hyperbar/Templates/ViewModelTemplateFactory.cs b/Hyperbar/Templates/ViewModelTemplateFactory.cs
deleted file mode 100644
index e2bf4e4..0000000
--- a/Hyperbar/Templates/ViewModelTemplateFactory.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using Microsoft.Extensions.DependencyInjection;
-
-namespace Hyperbar;
-
-public class ViewModelTemplateFactory(IViewModelTemplateDescriptorProvider descriptors,
- IServiceProvider services) :
- IViewModelTemplateFactory
-{
- public object? Create(object key)
- {
- if (descriptors.Get(key)
- is IViewModelTemplateDescriptor descriptor)
- {
- if (services.GetRequiredKeyedService(descriptor.TemplateType,
- descriptor.Key) is { } template)
- {
- return template;
- }
- }
-
- return default;
- }
-}
\ No newline at end of file