diff --git a/.gitignore b/.gitignore
index a599aa4..5270014 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
/.vs/*
*/obj/*
+*/bin/Debug/*
diff --git a/SewerStammGen/App.xaml b/SewerStammGen/App.xaml
index 1905fcb..b4be063 100644
--- a/SewerStammGen/App.xaml
+++ b/SewerStammGen/App.xaml
@@ -2,7 +2,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SewerStammGen"
- StartupUri="MainWindow.xaml">
+ >
diff --git a/SewerStammGen/App.xaml.cs b/SewerStammGen/App.xaml.cs
index 8ae58bb..39f7dc6 100644
--- a/SewerStammGen/App.xaml.cs
+++ b/SewerStammGen/App.xaml.cs
@@ -1,4 +1,8 @@
-using System;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using SewerStammGen.HostBuilders;
+using SewerStammGen.ViewModel;
+using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
@@ -13,5 +17,52 @@ namespace SewerStammGen
///
public partial class App : Application
{
+ private readonly IHost _host;
+ public App()
+ {
+ _host = CreateHostBuilder().Build();
+ }
+
+ static IHostBuilder CreateHostBuilder(string[]? args = null)
+ {
+ return Host.CreateDefaultBuilder(args)
+ .AddConfiguration()
+ .AddServices()
+ .AddViewModels()
+ .AddStores()
+ .AddDBContext();
+ }
+
+ protected override void OnStartup(StartupEventArgs e)
+ {
+ Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
+ AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
+
+ _host.Start();
+
+ MainWindow? window = new MainWindow() { DataContext = _host.Services.GetRequiredService() };
+ window.Show();
+
+ base.OnStartup(e);
+ }
+
+ private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
+ {
+ try
+ {
+ Exception ex = (Exception)e.ExceptionObject;
+ string text = "An application error occured. Plrease contact the Administrator with the following information:\n\n";
+ MessageBox.Show(text + " " + ex.Message + "\n\n" + ex.StackTrace);
+ }
+ catch (Exception ex2)
+ {
+ MessageBox.Show("Fatal Non-UI error", ex2.Message, MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+
+ private void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
+ {
+ throw new NotImplementedException();
+ }
}
}
diff --git a/SewerStammGen/EMainWindowViewType.cs b/SewerStammGen/EMainWindowViewType.cs
new file mode 100644
index 0000000..f2f7bbc
--- /dev/null
+++ b/SewerStammGen/EMainWindowViewType.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SewerStammGen
+{
+ public enum EMainWindowViewType
+ {
+ Home
+ }
+}
diff --git a/SewerStammGen/HostBuilders/AddConfigurationHostBuilderExtensions.cs b/SewerStammGen/HostBuilders/AddConfigurationHostBuilderExtensions.cs
new file mode 100644
index 0000000..790ffcb
--- /dev/null
+++ b/SewerStammGen/HostBuilders/AddConfigurationHostBuilderExtensions.cs
@@ -0,0 +1,24 @@
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Hosting;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SewerStammGen.HostBuilders
+{
+ static class AddConfigurationHostBuilderExtensions
+ {
+ public static IHostBuilder AddConfiguration(this IHostBuilder hostBuilder)
+ {
+ hostBuilder.ConfigureAppConfiguration(c =>
+ {
+ c.AddJsonFile("appsettings.json");
+ c.AddEnvironmentVariables();
+ }
+ );
+ return hostBuilder;
+ }
+ }
+}
diff --git a/SewerStammGen/HostBuilders/AddDBContextHostBuilderExtensions.cs b/SewerStammGen/HostBuilders/AddDBContextHostBuilderExtensions.cs
new file mode 100644
index 0000000..86a7333
--- /dev/null
+++ b/SewerStammGen/HostBuilders/AddDBContextHostBuilderExtensions.cs
@@ -0,0 +1,21 @@
+using Microsoft.Extensions.Hosting;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SewerStammGen.HostBuilders
+{
+ static class AddDBContextHostBuilderExtensions
+ {
+ public static IHostBuilder AddDBContext(this IHostBuilder hostBuilder)
+ {
+ hostBuilder.ConfigureServices((context, services) =>
+ {
+
+ });
+ return hostBuilder;
+ }
+ }
+}
diff --git a/SewerStammGen/HostBuilders/AddServicesHostBuilderExtensions.cs b/SewerStammGen/HostBuilders/AddServicesHostBuilderExtensions.cs
new file mode 100644
index 0000000..d554946
--- /dev/null
+++ b/SewerStammGen/HostBuilders/AddServicesHostBuilderExtensions.cs
@@ -0,0 +1,25 @@
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using SewerStammGen.Interface.Navigator;
+using SewerStammGen.ViewModel.State.Navigation;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SewerStammGen.HostBuilders
+{
+ internal static class AddServicesHostBuilderExtensions
+ {
+ public static IHostBuilder AddServices(this IHostBuilder host)
+ {
+ host.ConfigureServices(services =>
+ {
+ services.AddSingleton();
+ });
+ return host;
+ }
+ }
+}
diff --git a/SewerStammGen/HostBuilders/AddStoresHostBuilderExtensions.cs b/SewerStammGen/HostBuilders/AddStoresHostBuilderExtensions.cs
new file mode 100644
index 0000000..6fe3add
--- /dev/null
+++ b/SewerStammGen/HostBuilders/AddStoresHostBuilderExtensions.cs
@@ -0,0 +1,21 @@
+using Microsoft.Extensions.Hosting;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SewerStammGen.HostBuilders
+{
+ static class AddStoresHostBuilderExtensions
+ {
+ public static IHostBuilder AddStores(this IHostBuilder hostBuilder)
+ {
+ hostBuilder.ConfigureServices(services =>
+ {
+
+ });
+ return hostBuilder;
+ }
+ }
+}
diff --git a/SewerStammGen/HostBuilders/AddViewModelsHostBuilderExtensions.cs b/SewerStammGen/HostBuilders/AddViewModelsHostBuilderExtensions.cs
new file mode 100644
index 0000000..c225ff2
--- /dev/null
+++ b/SewerStammGen/HostBuilders/AddViewModelsHostBuilderExtensions.cs
@@ -0,0 +1,24 @@
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using SewerStammGen.ViewModel;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SewerStammGen.HostBuilders
+{
+ static class AddViewModelsHostBuilderExtensions
+ {
+ public static IHostBuilder AddViewModels(this IHostBuilder hostBuilder)
+ {
+ hostBuilder.ConfigureServices(services =>
+ {
+ services.AddTransient();
+ });
+
+ return hostBuilder;
+ }
+ }
+}
diff --git a/SewerStammGen/Interface/IViewModelAbstractFactory.cs b/SewerStammGen/Interface/IViewModelAbstractFactory.cs
new file mode 100644
index 0000000..00a887a
--- /dev/null
+++ b/SewerStammGen/Interface/IViewModelAbstractFactory.cs
@@ -0,0 +1,14 @@
+using SewerStammGen.ViewModel;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SewerStammGen.Interface
+{
+ public interface IViewModelAbstractFactory
+ {
+ BaseViewModel CreateViewModel(EMainWindowViewType viewType);
+ }
+}
diff --git a/SewerStammGen/Interface/Navigator/IMainWindowNavigator.cs b/SewerStammGen/Interface/Navigator/IMainWindowNavigator.cs
new file mode 100644
index 0000000..4b94778
--- /dev/null
+++ b/SewerStammGen/Interface/Navigator/IMainWindowNavigator.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SewerStammGen.Interface.Navigator
+{
+ internal interface IMainWindowNavigator : INavigator
+ {
+ }
+}
diff --git a/SewerStammGen/Interface/Navigator/INavigator.cs b/SewerStammGen/Interface/Navigator/INavigator.cs
new file mode 100644
index 0000000..bb3a267
--- /dev/null
+++ b/SewerStammGen/Interface/Navigator/INavigator.cs
@@ -0,0 +1,19 @@
+using SewerStammGen.ViewModel;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SewerStammGen.Interface.Navigator
+{
+ internal interface INavigator
+ {
+ BaseViewModel CurrentViewModel
+ {
+ get;
+ set;
+ }
+ event Action StateChanged;
+ }
+}
diff --git a/SewerStammGen/MainWindow.xaml b/SewerStammGen/MainWindow.xaml
index 4352748..b2ce5b6 100644
--- a/SewerStammGen/MainWindow.xaml
+++ b/SewerStammGen/MainWindow.xaml
@@ -3,10 +3,16 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:my="clr-namespace:SewerStammGen.Views"
xmlns:local="clr-namespace:SewerStammGen"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
-
+
+
+
+
+
+
diff --git a/SewerStammGen/MainWindow.xaml.cs b/SewerStammGen/MainWindow.xaml.cs
index b7de14d..fcda81c 100644
--- a/SewerStammGen/MainWindow.xaml.cs
+++ b/SewerStammGen/MainWindow.xaml.cs
@@ -23,6 +23,8 @@ namespace SewerStammGen
public MainWindow()
{
InitializeComponent();
+
+ SewerConnector.DataContext = new ViewModel.SewerConnectorViewModel();
}
}
}
diff --git a/SewerStammGen/SewerStammGen.csproj b/SewerStammGen/SewerStammGen.csproj
index d84276c..819c0f6 100644
--- a/SewerStammGen/SewerStammGen.csproj
+++ b/SewerStammGen/SewerStammGen.csproj
@@ -7,4 +7,16 @@
true
+
+
+
+
+
+
+
+
+ Always
+
+
+
diff --git a/SewerStammGen/SewerStammGen.csproj.user b/SewerStammGen/SewerStammGen.csproj.user
index 88a5509..3f5f9d0 100644
--- a/SewerStammGen/SewerStammGen.csproj.user
+++ b/SewerStammGen/SewerStammGen.csproj.user
@@ -1,4 +1,34 @@
+
+
+ Designer
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+ Designer
+
+
+ Designer
+
+
+ Designer
+
+
+ Designer
+
+
\ No newline at end of file
diff --git a/SewerStammGen/ViewModel/BaseViewModel.cs b/SewerStammGen/ViewModel/BaseViewModel.cs
new file mode 100644
index 0000000..5861806
--- /dev/null
+++ b/SewerStammGen/ViewModel/BaseViewModel.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SewerStammGen.ViewModel
+{
+ public delegate TViewModel CreateViewModel() where TViewModel : BaseViewModel;
+ public class BaseViewModel : ObservableObject
+ {
+ public virtual void Dispose() { }
+ }
+}
diff --git a/SewerStammGen/ViewModel/IViewModel.cs b/SewerStammGen/ViewModel/IViewModel.cs
new file mode 100644
index 0000000..9ea11a4
--- /dev/null
+++ b/SewerStammGen/ViewModel/IViewModel.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SewerStammGen.ViewModel
+{
+ public interface IViewModel : INotifyPropertyChanged
+ {
+
+ }
+
+ public interface IViewModel : IViewModel
+ {
+ [Browsable(false)]
+ [Bindable(false)]
+ TModel Model { get; set; }
+ }
+}
diff --git a/SewerStammGen/ViewModel/MainWindowViewModel.cs b/SewerStammGen/ViewModel/MainWindowViewModel.cs
new file mode 100644
index 0000000..92f0392
--- /dev/null
+++ b/SewerStammGen/ViewModel/MainWindowViewModel.cs
@@ -0,0 +1,21 @@
+using SewerStammGen.Interface.Navigator;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SewerStammGen.ViewModel
+{
+ internal class MainWindowViewModel : BaseViewModel
+ {
+ public IMainWindowNavigator Navigator { get; set; }
+ public BaseViewModel CurrentView => Navigator.CurrentViewModel;
+
+ public MainWindowViewModel(IMainWindowNavigator navigator)
+ {
+ Navigator = navigator;
+ }
+ }
+}
diff --git a/SewerStammGen/ViewModel/ObservableObject.cs b/SewerStammGen/ViewModel/ObservableObject.cs
new file mode 100644
index 0000000..22ee986
--- /dev/null
+++ b/SewerStammGen/ViewModel/ObservableObject.cs
@@ -0,0 +1,14 @@
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+
+namespace SewerStammGen.ViewModel
+{
+ public class ObservableObject : INotifyPropertyChanged
+ {
+ public event PropertyChangedEventHandler? PropertyChanged;
+ protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+}
\ No newline at end of file
diff --git a/SewerStammGen/ViewModel/RelayCommand.cs b/SewerStammGen/ViewModel/RelayCommand.cs
new file mode 100644
index 0000000..db205d4
--- /dev/null
+++ b/SewerStammGen/ViewModel/RelayCommand.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Input;
+
+namespace SewerStammGen.ViewModel
+{
+ [Serializable]
+ class RelayCommand : ICommand
+ {
+ #region Fields
+ private readonly Action