Navigation zwischen views Funktioniert

This commit is contained in:
HuskyTeufel
2021-09-14 20:37:33 +02:00
parent bbffb270bc
commit f6dd834f34
16 changed files with 210 additions and 98 deletions

View File

@@ -1,20 +1,8 @@
using System; namespace DaSaSo.ViewModel
using System.Collections.Generic; {
using System.ComponentModel; public class BaseViewModel : ObservableObject
using System.Linq; {
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace DaSaSo.ViewModel
{
public class BaseViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
} }
} }

View File

@@ -1,6 +1,7 @@
using DaSaSo.Domain.Model; using DaSaSo.Domain.Model;
using DaSaSo.Domain.Services; using DaSaSo.Domain.Services;
using DaSaSo.ViewModel.Commands; using DaSaSo.ViewModel.Commands;
using DaSaSo.ViewModel.Enums;
using DaSaSo.ViewModel.Interface; using DaSaSo.ViewModel.Interface;
using Microsoft.Toolkit.Mvvm.Input; using Microsoft.Toolkit.Mvvm.Input;
using System; using System;
@@ -19,11 +20,12 @@ namespace DaSaSo.ViewModel
public ObservableCollection<Client> Clients { get; } public ObservableCollection<Client> Clients { get; }
private Client? _selectedClient; private Client? _selectedClient;
private IDataService<Client> _dataService; private IDataService<Client> _dataService;
private readonly IRenavigator renavigator;
IEnumerable<Client>? result; IEnumerable<Client>? result;
bool _isLoading = true; bool _isLoading = true;
public ICommand SelectCommand { get; set; } public ICommand SelectCommand { get; set; }
public IRelayCommand EditClientCommand { get; set; } public ICommand EditCommand { get; set; }
public IRelayCommand AddNewClientCommand { get; set; } public IRelayCommand AddNewClientCommand { get; set; }
public Client SelectedClient public Client SelectedClient
@@ -54,19 +56,25 @@ namespace DaSaSo.ViewModel
} }
} }
public ClientListViewModel(IDataService<Client> dataService, IActualProject actualProject) public ClientListViewModel(IDataService<Client> dataService, IActualProject actualProject, IRenavigator renavigator)
{ {
Clients = new ObservableCollection<Client>(); Clients = new ObservableCollection<Client>();
_dataService = dataService; _dataService = dataService;
this.renavigator = renavigator;
LoadClient(); LoadClient();
SelectCommand = new SelectClientCommand(actualProject, this); //= new RelayCommand(SelectClient, () => SelectedClient != null); SelectCommand = new SelectClientCommand(actualProject, this); //= new RelayCommand(SelectClient, () => SelectedClient != null);
EditCommand = new EditClientCommand(actualProject,renavigator,this);
//EditClientCommand = new RelayCommand(EditClient, () => SelectedClient != null); //EditClientCommand = new RelayCommand(EditClient, () => SelectedClient != null);
//AddNewClientCommand = new RelayCommand(AddNewClient); //AddNewClientCommand = new RelayCommand(AddNewClient);
} }
private void edit()
{
//_navigator.UpdateViewModelCommand.Execute(EViewType.ClientEdit);
}
private async Task<Client> insertNewClient() private async Task<Client> insertNewClient()
{ {
Client newClient = new Client() Client newClient = new Client()

View File

@@ -0,0 +1,40 @@
using DaSaSo.ViewModel.Interface;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace DaSaSo.ViewModel.Commands
{
public class EditClientCommand : ICommand
{
private readonly IActualProject actualProject;
private readonly IRenavigator renavigator;
private readonly ClientListViewModel clientListViewModel;
public event EventHandler? CanExecuteChanged;
public EditClientCommand(IActualProject actualProject,IRenavigator renavigator, ClientListViewModel clientListViewModel)
{
this.actualProject = actualProject;
this.renavigator = renavigator;
this.clientListViewModel = clientListViewModel;
}
public bool CanExecute(object? parameter)
{
return true;
}
public void Execute(object? parameter)
{
actualProject.SetClient(clientListViewModel.SelectedClient);
renavigator.Renavigate();
}
}
}

View File

@@ -13,15 +13,17 @@ namespace DaSaSo.ViewModel.Factories
public class ClientListViewModelFactory : IViewModelFactory<ClientListViewModel> public class ClientListViewModelFactory : IViewModelFactory<ClientListViewModel>
{ {
private readonly IActualProject _actualProject; private readonly IActualProject _actualProject;
private readonly IRenavigator renavigator;
public ClientListViewModelFactory(IActualProject actualProject) public ClientListViewModelFactory(IActualProject actualProject, IRenavigator renavigator)
{ {
_actualProject = actualProject; _actualProject = actualProject;
this.renavigator = renavigator;
} }
public ClientListViewModel CreateViewModel() public ClientListViewModel CreateViewModel()
{ {
return new ClientListViewModel(new GenericDataService<Client>(new DaSaSoDbContextFactory()),_actualProject); return new ClientListViewModel(new GenericDataService<Client>(new DaSaSoDbContextFactory()),_actualProject, renavigator);
} }
} }
} }

View File

@@ -9,10 +9,15 @@ namespace DaSaSo.ViewModel.Interface
{ {
public interface IActualProject public interface IActualProject
{ {
event EventHandler? ClientChanged;
event EventHandler? ProjectChanged;
event EventHandler? BuildingSiteChanged;
Client AktuellClient { get; } Client AktuellClient { get; }
Project AktuellProjekt { get; } Project AktuellProjekt { get; }
Buildingsite AktuellBaustelle { get; } Buildingsite AktuellBaustelle { get; }
void SetClient(Client client); void SetClient(Client client);
void SetProject(Project project);
void SetBuildingSite(Buildingsite buildingsite);
} }
} }

View File

@@ -10,6 +10,6 @@ namespace DaSaSo.ViewModel.Interface
public interface INavigator public interface INavigator
{ {
BaseViewModel CurrentViewModel { get; set; } BaseViewModel CurrentViewModel { get; set; }
ICommand UpdateViewModelCommand { get; }
} }
} }

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DaSaSo.ViewModel.Interface
{
public interface IRenavigator
{
void Renavigate();
}
}

View File

@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace DaSaSo.ViewModel
{
public class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}

View File

@@ -11,14 +11,42 @@ namespace DaSaSo.ViewModel.State.ActualState
public class ActualProject : IActualProject public class ActualProject : IActualProject
{ {
public Client AktuellClient { get; private set; } public Client AktuellClient { get; private set; }
public Buildingsite AktuellBaustelle { get; private set; } public Buildingsite AktuellBaustelle { get; private set; }
public Project AktuellProjekt { get; private set; } public Project AktuellProjekt { get; private set; }
#region events
public event EventHandler? ClientChanged;
public event EventHandler? ProjectChanged;
public event EventHandler? BuildingSiteChanged;
protected void OnClientChanged()
{
ClientChanged?.Invoke(this, new EventArgs());
}
protected void OnProjectChanged()
{
ProjectChanged?.Invoke(this, new EventArgs());
}
protected void OnBuildingSiteChanged()
{
BuildingSiteChanged?.Invoke(this, new EventArgs());
}
#endregion
public void SetClient(Client client) public void SetClient(Client client)
{ {
AktuellClient = client; AktuellClient = client;
OnClientChanged();
}
public void SetProject(Project project)
{
AktuellProjekt = project;
OnProjectChanged();
}
public void SetBuildingSite(Buildingsite buildingsite)
{
AktuellBaustelle = buildingsite;
OnBuildingSiteChanged();
} }
} }
} }

View File

@@ -6,9 +6,9 @@ using System.Windows.Input;
namespace DaSaSo.ViewModel.State.Navigation namespace DaSaSo.ViewModel.State.Navigation
{ {
public class Navigator : INavigator, INotifyPropertyChanged public class Navigator : ObservableObject, INavigator
{ {
public event PropertyChangedEventHandler? PropertyChanged;
private BaseViewModel _currentViewModel; private BaseViewModel _currentViewModel;
public BaseViewModel CurrentViewModel public BaseViewModel CurrentViewModel
{ {
@@ -19,17 +19,5 @@ namespace DaSaSo.ViewModel.State.Navigation
OnPropertyChanged(); OnPropertyChanged();
} }
} }
public ICommand UpdateViewModelCommand { get; set; }
public Navigator(IViewModelAbstractFactory viewModelFactory)
{
UpdateViewModelCommand = new UpdateCurrentViewModelCommand(this, viewModelFactory);
}
protected void OnPropertyChanged([CallerMemberName]string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
} }
} }

View File

@@ -0,0 +1,26 @@
using DaSaSo.ViewModel.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DaSaSo.ViewModel.State.Navigation
{
public class ViewModelFactoryRenavigator<TViewModel> : IRenavigator where TViewModel : BaseViewModel
{
private readonly INavigator _navigator;
private readonly IViewModelFactory<TViewModel> _viewModelFactory;
public ViewModelFactoryRenavigator(INavigator navigator, IViewModelFactory<TViewModel> viewModelFactory)
{
_navigator = navigator;
_viewModelFactory = viewModelFactory;
}
public void Renavigate()
{
_navigator.CurrentViewModel = _viewModelFactory.CreateViewModel();
}
}
}

View File

@@ -1,6 +1,7 @@
using DaSaSo.Domain.Model; using DaSaSo.Domain.Model;
using DaSaSo.EntityFramework; using DaSaSo.EntityFramework;
using DaSaSo.EntityFramework.Services; using DaSaSo.EntityFramework.Services;
using DaSaSo.ViewModel.Commands;
using DaSaSo.ViewModel.Enums; using DaSaSo.ViewModel.Enums;
using DaSaSo.ViewModel.Interface; using DaSaSo.ViewModel.Interface;
using DaSaSo.ViewModel.State.Navigation; using DaSaSo.ViewModel.State.Navigation;
@@ -17,87 +18,78 @@ namespace DaSaSo.ViewModel
{ {
public sealed class MainWindowViewModel : BaseViewModel public sealed class MainWindowViewModel : BaseViewModel
{ {
private readonly IViewModelAbstractFactory viewModelFactory;
private Client _selectedClient; private readonly IActualProject _actualProject;
private Project _selectedProject; private string _clientname = "";
private Buildingsite _selectedBuildingsite; private string _projektname = "";
private string _buildingsitename = "";
public INavigator Navigator { get; set; } public INavigator Navigator { get; set; }
public ICommand UpdateCurrentViewModelCommand { get; }
public Project SelectedProject public string ClientName
{ {
get => _selectedProject; get => _clientname;
set set
{ {
if(_selectedProject != value) if(_clientname != value)
{ {
_selectedProject = value; _clientname = value;
OnPropertyChanged();
}
}
}
public Buildingsite SelectedBuildingsite
{
get => _selectedBuildingsite;
set
{
if(_selectedBuildingsite != value)
{
_selectedBuildingsite = value;
OnPropertyChanged(); OnPropertyChanged();
} }
} }
} }
public Client SelectedClient public string Projektname
{ {
get => _selectedClient; get => _projektname;
set set
{ {
if(_selectedClient != value) if (_projektname != value)
{ {
_selectedClient = value; _projektname = value;
//SelectedProject = null;
OnPropertyChanged(); OnPropertyChanged();
} }
} }
} }
public MainWindowViewModel(INavigator navigator) public string Buildingsitename
{
get => _buildingsitename;
set
{
if (_buildingsitename != value)
{
_buildingsitename = value;
OnPropertyChanged();
}
}
}
public MainWindowViewModel(INavigator navigator,IViewModelAbstractFactory viewModelFactory, IActualProject actualProject)
{ {
this.Navigator = navigator; this.Navigator = navigator;
Navigator.UpdateViewModelCommand.Execute(EViewType.Home); this.viewModelFactory = viewModelFactory;
UpdateCurrentViewModelCommand = new UpdateCurrentViewModelCommand(navigator, viewModelFactory);
UpdateCurrentViewModelCommand.Execute(EViewType.Home);
_actualProject = actualProject;
_actualProject.ClientChanged += _actualProject_ClientChanged;
_actualProject.ProjectChanged += _actualProject_ProjectChanged;
_actualProject.BuildingSiteChanged += _actualProject_BuildingSiteChanged;
}
private void _actualProject_BuildingSiteChanged(object? sender, EventArgs e)
Mediator.Subscribe(Enums.EMediator.SELECTEDCLIENT, (tt) =>
{ {
SelectedClient = (Client)tt; Buildingsitename = _actualProject.AktuellBaustelle.BuildingSiteNumber;
listProjecte(); }
});
Mediator.Subscribe(Enums.EMediator.EDITCLIENT, (tt) => private void _actualProject_ProjectChanged(object? sender, EventArgs e)
{ {
Projektname = _actualProject.AktuellProjekt.Name;
});
Mediator.Subscribe(Enums.EMediator.SHOWCLIENT, (tt) => {
});
} }
private void _actualProject_ClientChanged(object? sender, EventArgs e)
private void listSewerObjects()
{ {
throw new NotImplementedException(); ClientName = _actualProject.AktuellClient.Firstname;
}
private void listBuildingsite()
{
throw new NotImplementedException();
}
private void listProjecte()
{
} }
} }
} }

View File

@@ -37,8 +37,11 @@ namespace DaSaSo.Wpf
services.AddSingleton<IViewModelAbstractFactory, ViewModelAbstractFactory>(); services.AddSingleton<IViewModelAbstractFactory, ViewModelAbstractFactory>();
services.AddSingleton<IViewModelFactory<HomeViewModel>, HomeViewModelFactory>(); services.AddSingleton<IViewModelFactory<HomeViewModel>, HomeViewModelFactory>();
services.AddSingleton<IRenavigator, ViewModelFactoryRenavigator<ClientEditViewModel>>();
services.AddSingleton<IViewModelFactory<ClientListViewModel>, ClientListViewModelFactory>(); services.AddSingleton<IViewModelFactory<ClientListViewModel>, ClientListViewModelFactory>();
services.AddSingleton<IViewModelFactory<ClientEditViewModel>, ClientEditViewModelFactory>(); services.AddSingleton<IViewModelFactory<ClientEditViewModel>, ClientEditViewModelFactory>();
//services.AddSingleton<INavigator, Navigator>();
services.AddScoped<IActualProject, ActualProject>(); services.AddScoped<IActualProject, ActualProject>();
services.AddScoped<INavigator, Navigator>(); services.AddScoped<INavigator, Navigator>();

View File

@@ -14,9 +14,9 @@
<RowDefinition Height="auto" /> <RowDefinition Height="auto" />
<RowDefinition Height="auto" /> <RowDefinition Height="auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<RadioButton Grid.Row="0" Content="Kunden" Style="{StaticResource ToggleButtonList}" Command="{Binding UpdateViewModelCommand}" CommandParameter="{x:Static nav:EViewType.Clients}" /> <RadioButton Grid.Row="0" Content="Kunden" Style="{StaticResource ToggleButtonList}" Command="{Binding UpdateCurrentViewModelCommand}" CommandParameter="{x:Static nav:EViewType.Clients}" />
<RadioButton Grid.Row="1" Content="Projekte" Style="{StaticResource ToggleButtonList}" Command="{Binding UpdateViewModelCommand}" CommandParameter="{x:Static nav:EViewType.ClientEdit}" /> <RadioButton Grid.Row="1" Content="Projekte" Style="{StaticResource ToggleButtonList}" Command="{Binding UpdateCurrentViewModelCommand}" CommandParameter="{x:Static nav:EViewType.ClientEdit}" />
<RadioButton Grid.Row="2" Content="Baustellen" Style="{StaticResource ToggleButtonList}" Command="{Binding UpdateViewModelCommand}" CommandParameter="{x:Static nav:EViewType.Buildingsites}" /> <RadioButton Grid.Row="2" Content="Baustellen" Style="{StaticResource ToggleButtonList}" Command="{Binding UpdateCurrentViewModelCommand}" CommandParameter="{x:Static nav:EViewType.Buildingsites}" />
<RadioButton Grid.Row="3" Content="Objekten" Style="{StaticResource ToggleButtonList}" Command="{Binding UpdateViewModelCommand}" CommandParameter="{x:Static nav:EViewType.SewerObjects}" /> <RadioButton Grid.Row="3" Content="Objekten" Style="{StaticResource ToggleButtonList}" Command="{Binding UpdateCurrentViewModelCommand}" CommandParameter="{x:Static nav:EViewType.SewerObjects}" />
</Grid> </Grid>
</UserControl> </UserControl>

View File

@@ -14,7 +14,7 @@
<TextBlock Text="Kundenliste" /> <TextBlock Text="Kundenliste" />
<ListView ItemsSource="{Binding Clients}" DisplayMemberPath="Firstname" SelectedItem="{Binding SelectedClient, Mode=TwoWay}"/> <ListView ItemsSource="{Binding Clients}" DisplayMemberPath="Firstname" SelectedItem="{Binding SelectedClient, Mode=TwoWay}"/>
<Button Content="Kunde auswählen" Command="{Binding SelectCommand}" /> <Button Content="Kunde auswählen" Command="{Binding SelectCommand}" />
<Button Content="Kunde Editieren" Command="{Binding EditClientCommand}"/> <Button Content="Kunde Editieren" Command="{Binding EditCommand}"/>
<Button Content="Kunde Hinzufügen" Command="{Binding AddNewClientCommand}" /> <Button Content="Kunde Hinzufügen" Command="{Binding AddNewClientCommand}" />
</StackPanel> </StackPanel>
<Border Background="Gray" d:Visibility="Hidden" Visibility="{Binding IsLoading, Converter={StaticResource BooleanToVisibilityConverter}}"> <Border Background="Gray" d:Visibility="Hidden" Visibility="{Binding IsLoading, Converter={StaticResource BooleanToVisibilityConverter}}">

View File

@@ -33,10 +33,10 @@
<RowDefinition /> <RowDefinition />
<RowDefinition Height="20" /> <RowDefinition Height="20" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<controls:NavigationBar Grid.Column="0" Grid.Row="0" DataContext="{Binding Navigator }" /> <controls:NavigationBar Grid.Column="0" Grid.Row="0"/>
<ContentControl Grid.Column="1" Grid.Row="0" Content="{Binding Navigator.CurrentViewModel}" /> <ContentControl Grid.Column="1" Grid.Row="0" Content="{Binding Navigator.CurrentViewModel}" />
<StatusBar Grid.Row="1" Grid.ColumnSpan="2"> <StatusBar Grid.Row="1" Grid.ColumnSpan="2">
<StatusBarItem Content="{Binding SelectedClient.Firstname}" /> <StatusBarItem Content="{Binding ClientName}" />
</StatusBar> </StatusBar>
</Grid> </Grid>
</Window> </Window>