From 9007099d56fdb17857a59cd75e6f4faeb253dd74 Mon Sep 17 00:00:00 2001 From: Damian Wessels Date: Sun, 26 Mar 2023 14:00:02 +0200 Subject: [PATCH] =?UTF-8?q?lauff=C3=A4hige=20Grundversion=20erstellt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SewerStammGen/App.xaml | 6 +- SewerStammGen/Commands/AsyncCommandBase.cs | 45 +++++ .../Commands/UpdateCurrentViewModelCommand.cs | 32 ++++ .../{ => Enum}/EMainWindowViewType.cs | 7 +- .../AddViewModelsHostBuilderExtensions.cs | 10 + .../Interface/IViewModelAbstractFactory.cs | 3 +- .../Navigator/IMainWindowNavigator.cs | 2 +- .../Interface/Navigator/INavigator.cs | 2 +- SewerStammGen/MainWindow.xaml | 5 +- SewerStammGen/MainWindow.xaml.cs | 2 +- SewerStammGen/SewerStammGen.csproj.user | 15 ++ .../Factories/MainWindowViewModelFactory.cs | 34 ++++ SewerStammGen/ViewModel/HomeViewModel.cs | 12 ++ SewerStammGen/ViewModel/IViewModel.cs | 21 -- .../ViewModel/MainWindowViewModel.cs | 21 +- .../ViewModel/ProjectListViewModel.cs | 13 ++ .../ViewModel/SewerConnectorViewModel.cs | 2 +- SewerStammGen/ViewModel/ViewModel.cs | 179 ------------------ .../Controls/UCMainWindowNavigationBar.xaml | 25 +++ .../UCMainWindowNavigationBar.xaml.cs | 28 +++ .../EqualValueToParameterConverter.cs | 24 +++ SewerStammGen/Views/HomeView.xaml | 12 ++ SewerStammGen/Views/HomeView.xaml.cs | 28 +++ SewerStammGen/Views/styles/my_controls.xaml | 30 +++ 24 files changed, 344 insertions(+), 214 deletions(-) create mode 100644 SewerStammGen/Commands/AsyncCommandBase.cs create mode 100644 SewerStammGen/Commands/UpdateCurrentViewModelCommand.cs rename SewerStammGen/{ => Enum}/EMainWindowViewType.cs (64%) create mode 100644 SewerStammGen/ViewModel/Factories/MainWindowViewModelFactory.cs create mode 100644 SewerStammGen/ViewModel/HomeViewModel.cs delete mode 100644 SewerStammGen/ViewModel/IViewModel.cs create mode 100644 SewerStammGen/ViewModel/ProjectListViewModel.cs delete mode 100644 SewerStammGen/ViewModel/ViewModel.cs create mode 100644 SewerStammGen/Views/Controls/UCMainWindowNavigationBar.xaml create mode 100644 SewerStammGen/Views/Controls/UCMainWindowNavigationBar.xaml.cs create mode 100644 SewerStammGen/Views/Converters/EqualValueToParameterConverter.cs create mode 100644 SewerStammGen/Views/HomeView.xaml create mode 100644 SewerStammGen/Views/HomeView.xaml.cs create mode 100644 SewerStammGen/Views/styles/my_controls.xaml diff --git a/SewerStammGen/App.xaml b/SewerStammGen/App.xaml index b4be063..56ffa5b 100644 --- a/SewerStammGen/App.xaml +++ b/SewerStammGen/App.xaml @@ -4,6 +4,10 @@ xmlns:local="clr-namespace:SewerStammGen" > - + + + + + diff --git a/SewerStammGen/Commands/AsyncCommandBase.cs b/SewerStammGen/Commands/AsyncCommandBase.cs new file mode 100644 index 0000000..2efd230 --- /dev/null +++ b/SewerStammGen/Commands/AsyncCommandBase.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Input; + +namespace SewerStammGen.Commands +{ + internal abstract class AsyncCommandBase : ICommand + { + bool _isExecuting = false; + public event EventHandler? CanExecuteChanged; + + public bool IsExecuting + { + get => _isExecuting; + set + { + _isExecuting = value; + CanExecuteChanged?.Invoke(this, new EventArgs()); + } + } + + protected void OnCanExecuteChanged() + { + CanExecuteChanged?.Invoke(this, new EventArgs()); + } + + + public virtual bool CanExecute(object? parameter) + { + return !IsExecuting; + } + + public async void Execute(object? parameter) + { + IsExecuting = true; + await ExecuteAsync(parameter); + IsExecuting = false; + } + + public abstract Task ExecuteAsync(object? parameter); + } +} diff --git a/SewerStammGen/Commands/UpdateCurrentViewModelCommand.cs b/SewerStammGen/Commands/UpdateCurrentViewModelCommand.cs new file mode 100644 index 0000000..ffd8472 --- /dev/null +++ b/SewerStammGen/Commands/UpdateCurrentViewModelCommand.cs @@ -0,0 +1,32 @@ +using SewerStammGen.Enum; +using SewerStammGen.Interface; +using SewerStammGen.Interface.Navigator; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SewerStammGen.Commands +{ + internal class UpdateCurrentViewModelCommand : AsyncCommandBase + { + private INavigator _navigator; + private readonly IViewModelAbstractFactory _viewModelFactory; + + public UpdateCurrentViewModelCommand(INavigator navigator, IViewModelAbstractFactory viewModelFactory) + { + _navigator = navigator; + _viewModelFactory = viewModelFactory; + } + + public override async Task ExecuteAsync(object? parameter) + { + if(parameter is EMainWindowViewType) + { + EMainWindowViewType viewType = (EMainWindowViewType)parameter; + _navigator.CurrentViewModel = _viewModelFactory.CreateViewModel(viewType); + } + } + } +} diff --git a/SewerStammGen/EMainWindowViewType.cs b/SewerStammGen/Enum/EMainWindowViewType.cs similarity index 64% rename from SewerStammGen/EMainWindowViewType.cs rename to SewerStammGen/Enum/EMainWindowViewType.cs index f2f7bbc..4064bd1 100644 --- a/SewerStammGen/EMainWindowViewType.cs +++ b/SewerStammGen/Enum/EMainWindowViewType.cs @@ -4,10 +4,13 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace SewerStammGen +namespace SewerStammGen.Enum { public enum EMainWindowViewType { - Home + Home, + Projects, + Manholes, + Sewer } } diff --git a/SewerStammGen/HostBuilders/AddViewModelsHostBuilderExtensions.cs b/SewerStammGen/HostBuilders/AddViewModelsHostBuilderExtensions.cs index c225ff2..325671f 100644 --- a/SewerStammGen/HostBuilders/AddViewModelsHostBuilderExtensions.cs +++ b/SewerStammGen/HostBuilders/AddViewModelsHostBuilderExtensions.cs @@ -1,6 +1,8 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using SewerStammGen.Interface; using SewerStammGen.ViewModel; +using SewerStammGen.ViewModel.Factories; using System; using System.Collections.Generic; using System.Linq; @@ -16,6 +18,14 @@ namespace SewerStammGen.HostBuilders hostBuilder.ConfigureServices(services => { services.AddTransient(); + services.AddSingleton>(services => + { + return () => new HomeViewModel(); + }); + + + + services.AddSingleton(); }); return hostBuilder; diff --git a/SewerStammGen/Interface/IViewModelAbstractFactory.cs b/SewerStammGen/Interface/IViewModelAbstractFactory.cs index 00a887a..227dba8 100644 --- a/SewerStammGen/Interface/IViewModelAbstractFactory.cs +++ b/SewerStammGen/Interface/IViewModelAbstractFactory.cs @@ -1,4 +1,5 @@ -using SewerStammGen.ViewModel; +using SewerStammGen.Enum; +using SewerStammGen.ViewModel; using System; using System.Collections.Generic; using System.Linq; diff --git a/SewerStammGen/Interface/Navigator/IMainWindowNavigator.cs b/SewerStammGen/Interface/Navigator/IMainWindowNavigator.cs index 4b94778..d00c87a 100644 --- a/SewerStammGen/Interface/Navigator/IMainWindowNavigator.cs +++ b/SewerStammGen/Interface/Navigator/IMainWindowNavigator.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace SewerStammGen.Interface.Navigator { - internal interface IMainWindowNavigator : INavigator + public interface IMainWindowNavigator : INavigator { } } diff --git a/SewerStammGen/Interface/Navigator/INavigator.cs b/SewerStammGen/Interface/Navigator/INavigator.cs index bb3a267..a079e53 100644 --- a/SewerStammGen/Interface/Navigator/INavigator.cs +++ b/SewerStammGen/Interface/Navigator/INavigator.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace SewerStammGen.Interface.Navigator { - internal interface INavigator + public interface INavigator { BaseViewModel CurrentViewModel { diff --git a/SewerStammGen/MainWindow.xaml b/SewerStammGen/MainWindow.xaml index b2ce5b6..53ac263 100644 --- a/SewerStammGen/MainWindow.xaml +++ b/SewerStammGen/MainWindow.xaml @@ -5,14 +5,15 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:my="clr-namespace:SewerStammGen.Views" xmlns:local="clr-namespace:SewerStammGen" + xmlns:controls="clr-namespace:SewerStammGen.Views.Controls" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> - + - + diff --git a/SewerStammGen/MainWindow.xaml.cs b/SewerStammGen/MainWindow.xaml.cs index fcda81c..59577d8 100644 --- a/SewerStammGen/MainWindow.xaml.cs +++ b/SewerStammGen/MainWindow.xaml.cs @@ -24,7 +24,7 @@ namespace SewerStammGen { InitializeComponent(); - SewerConnector.DataContext = new ViewModel.SewerConnectorViewModel(); + //SewerConnector.DataContext = new ViewModel.SewerConnectorViewModel(); } } } diff --git a/SewerStammGen/SewerStammGen.csproj.user b/SewerStammGen/SewerStammGen.csproj.user index 3f5f9d0..e8337de 100644 --- a/SewerStammGen/SewerStammGen.csproj.user +++ b/SewerStammGen/SewerStammGen.csproj.user @@ -7,9 +7,15 @@ + + Code + Code + + Code + Code @@ -21,9 +27,18 @@ Designer + + Designer + Designer + + Designer + + + Designer + Designer diff --git a/SewerStammGen/ViewModel/Factories/MainWindowViewModelFactory.cs b/SewerStammGen/ViewModel/Factories/MainWindowViewModelFactory.cs new file mode 100644 index 0000000..c64c3a5 --- /dev/null +++ b/SewerStammGen/ViewModel/Factories/MainWindowViewModelFactory.cs @@ -0,0 +1,34 @@ +using SewerStammGen.Enum; +using SewerStammGen.Interface; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SewerStammGen.ViewModel.Factories +{ + public class MainWindowViewModelFactory : IViewModelAbstractFactory + { + private CreateViewModel _createHomeViewModel; + + public MainWindowViewModelFactory( + CreateViewModel createHomeViewModel + ) + { + _createHomeViewModel = createHomeViewModel; + } + + public BaseViewModel CreateViewModel(EMainWindowViewType viewType) + { + switch(viewType) + { + case EMainWindowViewType.Home: + return _createHomeViewModel(); + + default: + throw new NotImplementedException(); + } + } + } +} diff --git a/SewerStammGen/ViewModel/HomeViewModel.cs b/SewerStammGen/ViewModel/HomeViewModel.cs new file mode 100644 index 0000000..cb75f79 --- /dev/null +++ b/SewerStammGen/ViewModel/HomeViewModel.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SewerStammGen.ViewModel +{ + public class HomeViewModel : BaseViewModel + { + } +} diff --git a/SewerStammGen/ViewModel/IViewModel.cs b/SewerStammGen/ViewModel/IViewModel.cs deleted file mode 100644 index 9ea11a4..0000000 --- a/SewerStammGen/ViewModel/IViewModel.cs +++ /dev/null @@ -1,21 +0,0 @@ -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 index 92f0392..766becc 100644 --- a/SewerStammGen/ViewModel/MainWindowViewModel.cs +++ b/SewerStammGen/ViewModel/MainWindowViewModel.cs @@ -1,21 +1,34 @@ -using SewerStammGen.Interface.Navigator; +using SewerStammGen.Commands; +using SewerStammGen.Enum; +using SewerStammGen.Interface; +using SewerStammGen.Interface.Navigator; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; +using System.Windows.Input; namespace SewerStammGen.ViewModel { - internal class MainWindowViewModel : BaseViewModel + public class MainWindowViewModel : BaseViewModel { public IMainWindowNavigator Navigator { get; set; } - public BaseViewModel CurrentView => Navigator.CurrentViewModel; + public BaseViewModel CurrentViewModel => Navigator.CurrentViewModel; - public MainWindowViewModel(IMainWindowNavigator navigator) + public ICommand UpdateCurrentViewModelCommand { get; } + + public MainWindowViewModel( + IMainWindowNavigator navigator, + IViewModelAbstractFactory viewModelFactory + + ) { Navigator = navigator; + + UpdateCurrentViewModelCommand = new UpdateCurrentViewModelCommand(navigator, viewModelFactory); + UpdateCurrentViewModelCommand.Execute(EMainWindowViewType.Home); } } } diff --git a/SewerStammGen/ViewModel/ProjectListViewModel.cs b/SewerStammGen/ViewModel/ProjectListViewModel.cs new file mode 100644 index 0000000..82bea97 --- /dev/null +++ b/SewerStammGen/ViewModel/ProjectListViewModel.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SewerStammGen.ViewModel +{ + public class ProjectListViewModel : BaseViewModel + { + + } +} diff --git a/SewerStammGen/ViewModel/SewerConnectorViewModel.cs b/SewerStammGen/ViewModel/SewerConnectorViewModel.cs index 0d46598..4b7b1d2 100644 --- a/SewerStammGen/ViewModel/SewerConnectorViewModel.cs +++ b/SewerStammGen/ViewModel/SewerConnectorViewModel.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace SewerStammGen.ViewModel { - class SewerConnectorViewModel : ViewModel + class SewerConnectorViewModel : BaseViewModel { } } diff --git a/SewerStammGen/ViewModel/ViewModel.cs b/SewerStammGen/ViewModel/ViewModel.cs deleted file mode 100644 index a878ffe..0000000 --- a/SewerStammGen/ViewModel/ViewModel.cs +++ /dev/null @@ -1,179 +0,0 @@ -using Syncfusion.UI.Xaml.Collections.Generic; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Text; -using System.Threading.Tasks; - -namespace SewerStammGen.ViewModel -{ - [Serializable] - public abstract class ViewModel : IViewModel - { - protected ViewModel() - { - var initializationTask = new Task(() => Initialize()); - initializationTask.ContinueWith(result => InitializationCompletedCallback(result)); - initializationTask.Start(); - } - - - /// - /// Initializes this instance. - /// - protected virtual void Initialize() - { - } - - - /// - /// Callback method for the async initialization. - /// - /// The result. - private void InitializationCompletedCallback(IAsyncResult result) - { - var initializationCompleted = InitializationCompleted; - if (initializationCompleted != null) - { - InitializationCompleted(this, new AsyncCompletedEventArgs(null, !result.IsCompleted, result.AsyncState)); - } - InitializationCompleted = null; - } - - /// - /// Occurs when the initialization is completed. - /// - public event AsyncCompletedEventHandler InitializationCompleted; - - /// - /// Called when a property has changed. - /// - /// Name of the property. - /// - protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = "") - { - PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); - } - - #region INotifyPropertyChanged Members - - /// - /// Occurs when a property value changes. - /// - /// - public event PropertyChangedEventHandler PropertyChanged; - - #endregion - } - - public abstract class ViewModel : ViewModel, IViewModel where TModel : class - { - private TModel model; - - /// - /// The Model encapsulated by this ViewModel. - /// - /// If you change this, all needed PropertyChanged events will be raised automatically. - [Browsable(false)] - [Bindable(false)] - public TModel Model - { - get - { - return model; - } - set - { - if (Model != value) - { - // get all properties - var properties = this.GetType().GetProperties(BindingFlags.Public); - // all values before the model has changed - var oldValues = properties.Select(p => p.GetValue(this, null)); - var enumerator = oldValues.GetEnumerator(); - - model = value; - - // call OnPropertyChanged for all changed properties - foreach (var property in properties) - { - enumerator.MoveNext(); - var oldValue = enumerator.Current; - var newValue = property.GetValue(this, null); - - if ((oldValue == null && newValue != null) - || (oldValue != null && newValue == null) - || (!oldValue.Equals(newValue))) - { - OnPropertyChanged(property.Name); - } - } - } - } - } - - - /// - /// Initializes a new instance of the class. - /// - /// - protected ViewModel(TModel model) - : base() - { - this.Model = model; - } - - /// - /// Returns a hash code for this instance. - /// - /// - /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. - /// - public override int GetHashCode() - { - return Model.GetHashCode(); - } - - /// - /// Determines whether the specified is equal to this instance. - /// - /// The to compare with this instance. - /// - /// true if the specified is equal to this instance; otherwise, false. - /// - public override bool Equals(object obj) - { - if (obj == null) - return false; - - var other = obj as IViewModel; - - if (other == null) - return false; - - return Equals(other); - } - - - /// - /// Determines whether the specified is equal to this instance. - /// - /// The to compare with this instance. - /// - /// true if the specified is equal to this instance; otherwise, false. - /// - public bool Equals(IViewModel other) - { - if (other == null) - return false; - - if (Model == null) - return Model == other.Model; - - return Model.Equals(other.Model); - } - } -} diff --git a/SewerStammGen/Views/Controls/UCMainWindowNavigationBar.xaml b/SewerStammGen/Views/Controls/UCMainWindowNavigationBar.xaml new file mode 100644 index 0000000..d7eec9b --- /dev/null +++ b/SewerStammGen/Views/Controls/UCMainWindowNavigationBar.xaml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + diff --git a/SewerStammGen/Views/Controls/UCMainWindowNavigationBar.xaml.cs b/SewerStammGen/Views/Controls/UCMainWindowNavigationBar.xaml.cs new file mode 100644 index 0000000..1089341 --- /dev/null +++ b/SewerStammGen/Views/Controls/UCMainWindowNavigationBar.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace SewerStammGen.Views.Controls +{ + /// + /// Interaktionslogik für UCMainWindowNavigationBar.xaml + /// + public partial class UCMainWindowNavigationBar : UserControl + { + public UCMainWindowNavigationBar() + { + InitializeComponent(); + } + } +} diff --git a/SewerStammGen/Views/Converters/EqualValueToParameterConverter.cs b/SewerStammGen/Views/Converters/EqualValueToParameterConverter.cs new file mode 100644 index 0000000..2ad9793 --- /dev/null +++ b/SewerStammGen/Views/Converters/EqualValueToParameterConverter.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; + +namespace SewerStammGen.Views.Converters +{ + public class EqualValueToParameterConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value.ToString() == parameter.ToString(); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/SewerStammGen/Views/HomeView.xaml b/SewerStammGen/Views/HomeView.xaml new file mode 100644 index 0000000..8230e6b --- /dev/null +++ b/SewerStammGen/Views/HomeView.xaml @@ -0,0 +1,12 @@ + + + + + diff --git a/SewerStammGen/Views/HomeView.xaml.cs b/SewerStammGen/Views/HomeView.xaml.cs new file mode 100644 index 0000000..901125f --- /dev/null +++ b/SewerStammGen/Views/HomeView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace SewerStammGen.Views +{ + /// + /// Interaktionslogik für HomeView.xaml + /// + public partial class HomeView : UserControl + { + public HomeView() + { + InitializeComponent(); + } + } +} diff --git a/SewerStammGen/Views/styles/my_controls.xaml b/SewerStammGen/Views/styles/my_controls.xaml new file mode 100644 index 0000000..acfecb6 --- /dev/null +++ b/SewerStammGen/Views/styles/my_controls.xaml @@ -0,0 +1,30 @@ + + + \ No newline at end of file