diff --git a/.idea/.idea.PSCHelpdesk/.idea/riderPublish.xml b/.idea/.idea.PSCHelpdesk/.idea/riderPublish.xml
new file mode 100644
index 0000000..6c0c664
--- /dev/null
+++ b/.idea/.idea.PSCHelpdesk/.idea/riderPublish.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.PSCHelpdesk/.idea/workspace.xml b/.idea/.idea.PSCHelpdesk/.idea/workspace.xml
index 56624eb..8d5a2b3 100644
--- a/.idea/.idea.PSCHelpdesk/.idea/workspace.xml
+++ b/.idea/.idea.PSCHelpdesk/.idea/workspace.xml
@@ -11,17 +11,21 @@
-
+
+
-
+
+
+
+
-
-
+
+
@@ -35,20 +39,26 @@
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
@@ -74,6 +84,7 @@
-
+
@@ -113,6 +124,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -151,6 +180,7 @@
+
@@ -194,31 +224,102 @@
-
- file://$PROJECT_DIR$/PSCHelpdesk/PSCHelpdesk/Views/ContentDisplay.axaml.cs
- 39
-
-
-
-
-
-
-
-
-
-
file://$PROJECT_DIR$/HetznerServer/Menu/MainMenu.cs
13
-
+
+
+
+
+ file://$PROJECT_DIR$/PSCHelpdesk/PSCHelpdesk/ViewModels/MainWindowViewModel.cs
+ 93
+
-
+
-
+
-
+
+
+
+ file://$PROJECT_DIR$/PSCHelpdesk/PSCHelpdesk/ViewModels/MainWindowViewModel.cs
+ 94
+
+
+
+
+
+
+
+
+
+
+
+ file://$PROJECT_DIR$/PSCHelpdesk/PSCHelpdesk/ViewLocator.cs
+ 25
+
+
+
+
+
+
+
+
+
+
+
+ file://$PROJECT_DIR$/PSCHelpdesk/PSCHelpdesk/ViewLocator.cs
+ 27
+
+
+
+
+
+
+
+
+
+
+
+ file://$PROJECT_DIR$/PSCHelpdesk/PSCHelpdesk/ViewModels/MainWindowViewModel.cs
+ 113
+
+
+
+
+
+
+
+
+
+
+
+ file://$PROJECT_DIR$/PSCHelpdesk/PSCHelpdesk/ViewModels/MainWindowViewModel.cs
+ 86
+
+
+
+
+
+
+
+
+
+
+
+ file://$PROJECT_DIR$/PSCHelpdesk/PSCHelpdesk/ViewModels/MainWindowViewModel.cs
+ 107
+
+
+
+
+
+
+
+
+
diff --git a/HetznerServer/HetznerServer.cs b/HetznerServer/HetznerServer.cs
index ec1f061..1bde1a3 100644
--- a/HetznerServer/HetznerServer.cs
+++ b/HetznerServer/HetznerServer.cs
@@ -18,20 +18,24 @@ public class HetznerServer : Contract
return "HetznerServerPlugin";
}
- public void addMenu()
+ public Item addMenu()
{
- var menuService = Ioc.Default.GetService();
+ //var menuService = Ioc.Default.GetService();
var serverTab = new Item()
{
Header = "Server",
- ViewModel = typeof(ServerViewModel)
};
- menuService.AddMenuItem(serverTab);
- //return serverTab;
+ //menuService.AddMenuItem(serverTab);
+ return serverTab;
}
- public UserControl load()
+ public UserControl LoadView()
{
return new ServerView();
}
+
+ public object LoadViewModel()
+ {
+ return new ServerViewModel();
+ }
}
\ No newline at end of file
diff --git a/HetznerServer/HetznerServer.csproj b/HetznerServer/HetznerServer.csproj
index ef23b7a..e7b6027 100644
--- a/HetznerServer/HetznerServer.csproj
+++ b/HetznerServer/HetznerServer.csproj
@@ -19,10 +19,7 @@
-
-
-
-
+
@@ -44,6 +41,8 @@
+
+
diff --git a/HetznerServer/ViewModels/ServerViewModel.cs b/HetznerServer/ViewModels/ServerViewModel.cs
index ad5d5c4..abb9c34 100644
--- a/HetznerServer/ViewModels/ServerViewModel.cs
+++ b/HetznerServer/ViewModels/ServerViewModel.cs
@@ -1,9 +1,5 @@
-using System.Collections.Generic;
-using System.Collections.ObjectModel;
-using System.Diagnostics;
-using System.Threading.Tasks;
+using System.Collections.ObjectModel;
using Avalonia.Controls;
-using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using HetznerCloudApi;
using PSCHelpdesk.Plugins.HetznerServer.Models;
@@ -12,7 +8,7 @@ using PSCHelpdesk.Shared.ViewModels;
namespace PSCHelpdesk.Plugins.HetznerServer.ViewModels;
-public partial class ServerViewModel : ViewModelBase
+public partial class ServerViewModel : ViewModelBase, IViewModelBase
{
public ServerViewModel()
{
diff --git a/PSCHelpdesk.sln.DotSettings.user b/PSCHelpdesk.sln.DotSettings.user
index cb9f1ee..77fab93 100644
--- a/PSCHelpdesk.sln.DotSettings.user
+++ b/PSCHelpdesk.sln.DotSettings.user
@@ -26,12 +26,14 @@
ForceIncluded
ForceIncluded
ForceIncluded
+ ForceIncluded
ForceIncluded
ForceIncluded
ForceIncluded
ForceIncluded
ForceIncluded
ForceIncluded
+ ForceIncluded
ForceIncluded
ForceIncluded
ForceIncluded
@@ -46,10 +48,12 @@
ForceIncluded
ForceIncluded
ForceIncluded
+ ForceIncluded
ForceIncluded
ForceIncluded
ForceIncluded
ForceIncluded
+ ForceIncluded
ForceIncluded
True
@@ -60,7 +64,11 @@
</AssemblyExplorer>
True
True
+ True
+ True
True
+ True
+ True
diff --git a/PSCHelpdesk/PSCHelpdesk/Converter/AvaloniaPluginResultConverter.cs b/PSCHelpdesk/PSCHelpdesk/Converter/AvaloniaPluginResultConverter.cs
new file mode 100644
index 0000000..4819829
--- /dev/null
+++ b/PSCHelpdesk/PSCHelpdesk/Converter/AvaloniaPluginResultConverter.cs
@@ -0,0 +1,14 @@
+using System;
+using Prise.Proxy;
+
+namespace PSCHelpdesk.Converter;
+
+public class AvaloniaPluginResultConverter : ResultConverter
+{
+ public override object Deserialize(Type localType, Type remoteType, object value)
+ {
+ // No conversion, no backwards compatibility
+ // When the host upgrades any Avalonia dependency, it will break
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/PSCHelpdesk/PSCHelpdesk/PSCHelpdesk.csproj b/PSCHelpdesk/PSCHelpdesk/PSCHelpdesk.csproj
index 16e1850..1c78946 100644
--- a/PSCHelpdesk/PSCHelpdesk/PSCHelpdesk.csproj
+++ b/PSCHelpdesk/PSCHelpdesk/PSCHelpdesk.csproj
@@ -19,16 +19,15 @@
+
+
+
-
-
-
-
diff --git a/PSCHelpdesk/PSCHelpdesk/Services/PluginService.cs b/PSCHelpdesk/PSCHelpdesk/Services/PluginService.cs
index 68fe5d7..453583d 100644
--- a/PSCHelpdesk/PSCHelpdesk/Services/PluginService.cs
+++ b/PSCHelpdesk/PSCHelpdesk/Services/PluginService.cs
@@ -1,6 +1,7 @@
using System.Linq;
using CommunityToolkit.Mvvm.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
+using PSCHelpdesk.Shared.Menu;
using PSCHelpdesk.Shared.Plugin;
using PSCHelpdesk.Shared.Service;
@@ -71,7 +72,8 @@ public class PluginService
var plugin = await pluginLoader.LoadPlugin(pluginToEnable, configure: (context) =>
{
context
-
+ .AddHostTypes(new[] {typeof(Application), typeof(Item)})
+ .AddRemoteTypes(new []{typeof(Item)})
.AddHostService(menuService)
.AddHostService(testService)
//.AddHostService(settingsService)
@@ -83,7 +85,10 @@ public class PluginService
if (!this.loadedPlugins.ContainsKey(pluginName))
{
loadedPlugins.Add(plugin.GetName(), plugin);
- plugin.addMenu();
+ var item = plugin.addMenu();
+ item.GetView = plugin.LoadView();
+ item.ViewModel = plugin.LoadViewModel();
+ menuService.AddMenuItem(item);
appService.AppIsStarted();
}
}
diff --git a/PSCHelpdesk/PSCHelpdesk/Startup.cs b/PSCHelpdesk/PSCHelpdesk/Startup.cs
index cc15f6d..1f6e658 100644
--- a/PSCHelpdesk/PSCHelpdesk/Startup.cs
+++ b/PSCHelpdesk/PSCHelpdesk/Startup.cs
@@ -1,6 +1,8 @@
using CommunityToolkit.Mvvm.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Prise.DependencyInjection;
+using Prise.Proxy;
+using PSCHelpdesk.Converter;
using PSCHelpdesk.Services;
using PSCHelpdesk.Shared.Service;
using PSCHelpdesk.ViewModels;
@@ -15,6 +17,7 @@ class Startup
var te = new ServiceCollection()
.AddPrise()
+ .AddFactory(()=> new AvaloniaPluginResultConverter())
.AddSingleton()
.AddSingleton(menuService)
.AddSingleton(new TestService())
diff --git a/PSCHelpdesk/PSCHelpdesk/ViewLocator.cs b/PSCHelpdesk/PSCHelpdesk/ViewLocator.cs
index 84dbc55..3d37fcc 100644
--- a/PSCHelpdesk/PSCHelpdesk/ViewLocator.cs
+++ b/PSCHelpdesk/PSCHelpdesk/ViewLocator.cs
@@ -1,15 +1,24 @@
using System;
+using System.Reflection;
using Avalonia.Controls;
using Avalonia.Controls.Templates;
+using CommunityToolkit.Mvvm.DependencyInjection;
+using PSCHelpdesk.Services;
using PSCHelpdesk.Shared.ViewModels;
-using PSCHelpdesk.ViewModels;
namespace PSCHelpdesk;
public class ViewLocator : IDataTemplate
{
+ private PluginService _pluginService;
+
+
public Control? Build(object? data)
{
+ if (_pluginService == null)
+ {
+ _pluginService = Ioc.Default.GetService();
+ }
if (data is null)
return null;
@@ -24,8 +33,10 @@ public class ViewLocator : IDataTemplate
return new TextBlock { Text = "Not Found: " + name };
}
- public bool Match(object? data)
+ public bool Match(object data)
{
- return data is ViewModelBase;
+ var l = data is IViewModelBase;
+ Console.WriteLine($"[{l}:{data}]");
+ return l;
}
}
\ No newline at end of file
diff --git a/PSCHelpdesk/PSCHelpdesk/ViewModels/MainWindowViewModel.cs b/PSCHelpdesk/PSCHelpdesk/ViewModels/MainWindowViewModel.cs
index 0bddcfc..c24e549 100644
--- a/PSCHelpdesk/PSCHelpdesk/ViewModels/MainWindowViewModel.cs
+++ b/PSCHelpdesk/PSCHelpdesk/ViewModels/MainWindowViewModel.cs
@@ -84,9 +84,14 @@ public class MainWindowViewModel : ViewModelBase
{
get
{
+ if (SelectedItem.GetView != null)
+ {
+ var vm = SelectedItem.GetView;
+ return vm;
+ }
if (SelectedItem.ViewModel != null)
{
- var vm = SelectedItem.ViewModel.CreateInstance();
+ var vm = SelectedItem.ViewModel;
return vm;
}
return this.SelectedItem?.CommandParameter;
@@ -100,9 +105,13 @@ public class MainWindowViewModel : ViewModelBase
if (obj != null)
{
this.SelectedItem = obj;
+ if (SelectedItem.GetView != null)
+ {
+ this.ContentDisplay = SelectedItem.GetView;
+ }
if (obj.ViewModel != null)
{
- this.ContentDisplay = obj.ViewModel.CreateInstance();
+ this.ContentDisplay = obj.ViewModel;
}
else
{
diff --git a/PSCHelpdesk/PSCHelpdesk/ViewModels/TestViewModel.cs b/PSCHelpdesk/PSCHelpdesk/ViewModels/TestViewModel.cs
index c2d07fe..0029a31 100644
--- a/PSCHelpdesk/PSCHelpdesk/ViewModels/TestViewModel.cs
+++ b/PSCHelpdesk/PSCHelpdesk/ViewModels/TestViewModel.cs
@@ -2,7 +2,7 @@
namespace PSCHelpdesk.ViewModels;
-public partial class TestViewModel: ViewModelBase
+public partial class TestViewModel: ViewModelBase, IViewModelBase
{
public TestViewModel()
{
diff --git a/PSCHelpdesk/PSCHelpdesk/Views/ContentDisplay.axaml.cs b/PSCHelpdesk/PSCHelpdesk/Views/ContentDisplay.axaml.cs
index e1d3465..51d0c29 100644
--- a/PSCHelpdesk/PSCHelpdesk/Views/ContentDisplay.axaml.cs
+++ b/PSCHelpdesk/PSCHelpdesk/Views/ContentDisplay.axaml.cs
@@ -75,7 +75,7 @@ public class ContentDisplay : TemplatedControl
{
if (SelectedItem.ViewModel != null)
{
- var vm = SelectedItem.ViewModel.CreateInstance();
+ var vm = SelectedItem.ViewModel;
return vm;
}
return this.SelectedItem?.CommandParameter ?? this.SelectedOption?.CommandParameter;
diff --git a/Shared/Menu/Item.cs b/Shared/Menu/Item.cs
index 0cb10e8..27c7d6b 100644
--- a/Shared/Menu/Item.cs
+++ b/Shared/Menu/Item.cs
@@ -13,7 +13,7 @@ public class Item
public object CommandParameter { get; set; }
- public Type ViewModel { get; set; }
+ public object ViewModel { get; set; }
public UserControl GetView { get; set; }
public IList- Items { get; set; }
diff --git a/Shared/Plugin/Contract.cs b/Shared/Plugin/Contract.cs
index 19554cb..cb9596c 100644
--- a/Shared/Plugin/Contract.cs
+++ b/Shared/Plugin/Contract.cs
@@ -8,8 +8,9 @@ public interface Contract
{
string GetName();
- void addMenu();
+ Item addMenu();
- UserControl load();
+ UserControl LoadView();
+ object LoadViewModel();
}
\ No newline at end of file
diff --git a/Shared/ViewModels/IViewModelBase.cs b/Shared/ViewModels/IViewModelBase.cs
new file mode 100644
index 0000000..5c676a7
--- /dev/null
+++ b/Shared/ViewModels/IViewModelBase.cs
@@ -0,0 +1,6 @@
+namespace PSCHelpdesk.Shared.ViewModels;
+
+public interface IViewModelBase
+{
+
+}
\ No newline at end of file
diff --git a/Shared/ViewModels/ViewModelBase.cs b/Shared/ViewModels/ViewModelBase.cs
index be813f6..b512544 100644
--- a/Shared/ViewModels/ViewModelBase.cs
+++ b/Shared/ViewModels/ViewModelBase.cs
@@ -4,7 +4,7 @@ using System.Runtime.CompilerServices;
namespace PSCHelpdesk.Shared.ViewModels;
-public abstract class ViewModelBase : INotifyPropertyChanged
+public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;