From a5559eebe699831100d666fe38788c28d6510534 Mon Sep 17 00:00:00 2001
From: TheJoKlLa <thejoklla@gmail.com>
Date: Thu, 12 Nov 2020 20:04:31 +0100
Subject: [PATCH] BackUp

---
 Borepin/Borepin/App.xaml.cs                   |  2 +-
 Borepin/Borepin/Base/PageModelLocator.cs      |  8 +-
 .../Borepin/Behaviour/Base/BehaviorBase.cs    | 37 ++++++++
 .../Behaviour/EventToCommandBehavior.cs       | 91 +++++++++++++++++++
 Borepin/Borepin/Borepin.csproj                | 21 +++++
 .../Borepin/Page/BorpinMasterDetailPage.xaml  | 16 ++++
 .../Page/BorpinMasterDetailPage.xaml.cs       | 19 ++++
 Borepin/Borepin/Page/BorpinMasterPage.xaml    | 49 ++++++++++
 Borepin/Borepin/Page/BorpinMasterPage.xaml.cs | 23 +++++
 Borepin/Borepin/Page/MachinesPage.xaml        |  9 ++
 Borepin/Borepin/Page/MachinesPage.xaml.cs     | 20 ++++
 Borepin/Borepin/Page/MasterMenuItem.cs        | 21 +++++
 Borepin/Borepin/Page/SettingsPage.xaml        | 11 +++
 Borepin/Borepin/Page/SettingsPage.xaml.cs     | 20 ++++
 .../PageModel/BorpinMasterDetailPageModel.cs  | 48 ++++++++++
 .../PageModel/BorpinMasterPageModel.cs        | 76 ++++++++++++++++
 .../Borepin/PageModel/MachinesPageModel.cs    | 20 ++++
 .../Borepin/PageModel/SettingsPageModel.cs    | 12 +++
 .../Service/Navigation/NavigationService.cs   | 20 +++-
 19 files changed, 519 insertions(+), 4 deletions(-)
 create mode 100644 Borepin/Borepin/Behaviour/Base/BehaviorBase.cs
 create mode 100644 Borepin/Borepin/Behaviour/EventToCommandBehavior.cs
 create mode 100644 Borepin/Borepin/Page/BorpinMasterDetailPage.xaml
 create mode 100644 Borepin/Borepin/Page/BorpinMasterDetailPage.xaml.cs
 create mode 100644 Borepin/Borepin/Page/BorpinMasterPage.xaml
 create mode 100644 Borepin/Borepin/Page/BorpinMasterPage.xaml.cs
 create mode 100644 Borepin/Borepin/Page/MachinesPage.xaml
 create mode 100644 Borepin/Borepin/Page/MachinesPage.xaml.cs
 create mode 100644 Borepin/Borepin/Page/MasterMenuItem.cs
 create mode 100644 Borepin/Borepin/Page/SettingsPage.xaml
 create mode 100644 Borepin/Borepin/Page/SettingsPage.xaml.cs
 create mode 100644 Borepin/Borepin/PageModel/BorpinMasterDetailPageModel.cs
 create mode 100644 Borepin/Borepin/PageModel/BorpinMasterPageModel.cs
 create mode 100644 Borepin/Borepin/PageModel/MachinesPageModel.cs
 create mode 100644 Borepin/Borepin/PageModel/SettingsPageModel.cs

diff --git a/Borepin/Borepin/App.xaml.cs b/Borepin/Borepin/App.xaml.cs
index cf0276d..8c84b7d 100644
--- a/Borepin/Borepin/App.xaml.cs
+++ b/Borepin/Borepin/App.xaml.cs
@@ -18,7 +18,7 @@ namespace Borepin
         Task InitNavigation()
         {
             var navService = PageModelLocator.Resolve<INavigationService>();
-            return navService.NaviagteToAsync<LoginPageModel>();
+            return navService.NaviagteToAsync<BorpinMasterDetailPageModel>(null, true);
         }
 
         protected override async void OnStart()
diff --git a/Borepin/Borepin/Base/PageModelLocator.cs b/Borepin/Borepin/Base/PageModelLocator.cs
index 8f2963b..9a1f5dc 100644
--- a/Borepin/Borepin/Base/PageModelLocator.cs
+++ b/Borepin/Borepin/Base/PageModelLocator.cs
@@ -18,9 +18,15 @@ namespace Borepin.Base
             _ViewLookUp = new Dictionary<Type, Type>();
 
             // Register Pages and PageModels
+            Register<BorpinMasterDetailPageModel, BorpinMasterDetailPage>();
+            Register<BorpinMasterPageModel, BorpinMasterPage>();
+
+            Register<MachinesPageModel, MachinesPage>();
+            Register<SettingsPageModel, SettingsPage>();
+
             Register<DashboardPageModel, DashboardPage>();
             Register<LoginPageModel, LoginPage>();
-
+            
             // Register Services (Services are registered by Singeltons default)
             _Container.Register<INavigationService, NavigationService>();
         }
diff --git a/Borepin/Borepin/Behaviour/Base/BehaviorBase.cs b/Borepin/Borepin/Behaviour/Base/BehaviorBase.cs
new file mode 100644
index 0000000..807a4f2
--- /dev/null
+++ b/Borepin/Borepin/Behaviour/Base/BehaviorBase.cs
@@ -0,0 +1,37 @@
+using System;
+using Xamarin.Forms;
+
+namespace Borepin.Behaviour.Base
+{
+    public class BehaviorBase<T> : Behavior<T> where T : BindableObject
+    {
+        public T AssociatedObject { get; private set; }
+        protected override void OnAttachedTo(T bindable)
+        {
+            base.OnAttachedTo(bindable);
+            AssociatedObject = bindable;
+
+            if (bindable.BindingContext != null)
+                BindingContext = bindable.BindingContext;
+
+            bindable.BindingContextChanged += OnBindingContextChanged;
+        }
+        protected override void OnDetachingFrom(T bindable)
+        {
+            base.OnDetachingFrom(bindable);
+            bindable.BindingContextChanged -= OnBindingContextChanged;
+            AssociatedObject = null;
+        }
+
+        void OnBindingContextChanged(object sender, EventArgs e)
+        {
+            OnBindingContextChanged();
+        }
+
+        protected override void OnBindingContextChanged()
+        {
+            base.OnBindingContextChanged();
+            BindingContext = AssociatedObject.BindingContext;
+        }
+    }
+}
diff --git a/Borepin/Borepin/Behaviour/EventToCommandBehavior.cs b/Borepin/Borepin/Behaviour/EventToCommandBehavior.cs
new file mode 100644
index 0000000..65441a2
--- /dev/null
+++ b/Borepin/Borepin/Behaviour/EventToCommandBehavior.cs
@@ -0,0 +1,91 @@
+using Borepin.Behaviour.Base;
+using System;
+using System.Reflection;
+using System.Windows.Input;
+using Xamarin.Forms;
+
+namespace Borepin.Behaviour
+{
+    public class EventToCommandBehavior : BehaviorBase<VisualElement>
+    {
+        Delegate eventHandler;
+        public static readonly BindableProperty EventNameProperty = BindableProperty.Create("EventName", typeof(string), typeof(EventToCommandBehavior), null, propertyChanged: OnEventNameChanged);
+        public static readonly BindableProperty CommandProperty = BindableProperty.Create("Command", typeof(ICommand), typeof(EventToCommandBehavior), null);
+
+        public string EventName
+        {
+            get { return (string)GetValue(EventNameProperty); }
+            set { SetValue(EventNameProperty, value); }
+        }
+        public ICommand Command
+        {
+            get { return (ICommand)GetValue(CommandProperty); }
+            set { SetValue(CommandProperty, value); }
+        }
+
+        protected override void OnAttachedTo(VisualElement bindable)
+        {
+            base.OnAttachedTo(bindable);
+            RegisterEvent(EventName);
+        }
+
+        protected override void OnDetachingFrom(VisualElement bindable)
+        {
+            DeregisterEvent(EventName);
+            base.OnDetachingFrom(bindable);
+        }
+        static void OnEventNameChanged(BindableObject bindable, object oldValue, object newValue)
+        {
+            var behavior = (EventToCommandBehavior)bindable;
+
+            if (behavior.AssociatedObject == null) return;
+
+            string oldEventName = (string)oldValue;
+            string newEventName = (string)newValue;
+
+            behavior.DeregisterEvent(oldEventName);
+            behavior.RegisterEvent(newEventName);
+        }
+
+        void RegisterEvent(string name)
+        {
+            if (string.IsNullOrWhiteSpace(name)) return;
+
+            EventInfo eventInfo = AssociatedObject.GetType().GetRuntimeEvent(name);
+
+            if (eventInfo == null)
+                throw new ArgumentException(string.Format("EventToCommandBehavior: Can't register the '{0}' event.", EventName));
+
+            MethodInfo methodInfo = typeof(EventToCommandBehavior).GetTypeInfo().GetDeclaredMethod("OnEvent");
+            eventHandler = methodInfo.CreateDelegate(eventInfo.EventHandlerType, this);
+            eventInfo.AddEventHandler(AssociatedObject, eventHandler);
+        }
+
+        void DeregisterEvent(string name)
+        {
+            if (string.IsNullOrWhiteSpace(name) || eventHandler == null)
+                return;
+
+            EventInfo eventInfo = AssociatedObject.GetType().GetRuntimeEvent(name);
+
+            if (eventInfo == null)
+                throw new ArgumentException(string.Format("EventToCommandBehavior: Can't de-register the '{0}' event.", EventName));
+
+            eventInfo.RemoveEventHandler(AssociatedObject, eventHandler);
+            eventHandler = null;
+        }
+
+        void OnEvent(object sender, object eventArgs)
+        {
+            if (Command == null) return;
+
+            object resolvedParameter;
+
+            resolvedParameter = eventArgs;
+
+            if (Command.CanExecute(resolvedParameter))
+                Command.Execute(resolvedParameter);
+        }
+
+    }
+}
diff --git a/Borepin/Borepin/Borepin.csproj b/Borepin/Borepin/Borepin.csproj
index 1bda1c9..4cdc56d 100644
--- a/Borepin/Borepin/Borepin.csproj
+++ b/Borepin/Borepin/Borepin.csproj
@@ -24,6 +24,15 @@
     <PackageReference Include="Xamarin.Essentials" Version="1.5.3.2" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Update="Page\BorpinMasterDetailPage.xaml.cs">
+      <DependentUpon>BorpinMasterDetailPage.xaml</DependentUpon>
+    </Compile>
+    <Compile Update="Page\BorpinMasterPage.xaml.cs">
+      <DependentUpon>BorpinMasterPage.xaml</DependentUpon>
+    </Compile>
+    <Compile Update="Page\MachinesPage.xaml.cs">
+      <DependentUpon>MachinesPage.xaml</DependentUpon>
+    </Compile>
     <Compile Update="Properties\Resources.Designer.cs">
       <DesignTime>True</DesignTime>
       <AutoGen>True</AutoGen>
@@ -39,12 +48,24 @@
     </Compile>
   </ItemGroup>
   <ItemGroup>
+    <EmbeddedResource Update="Page\BorpinMasterDetailPage.xaml">
+      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
+    </EmbeddedResource>
+    <EmbeddedResource Update="Page\MachinesPage.xaml">
+      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
+    </EmbeddedResource>
+    <EmbeddedResource Update="Page\BorpinMasterPage.xaml">
+      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
+    </EmbeddedResource>
     <EmbeddedResource Update="Page\DashboardPage.xaml">
       <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
     </EmbeddedResource>
     <EmbeddedResource Update="Page\LoginPage.xaml">
       <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
     </EmbeddedResource>
+    <EmbeddedResource Update="Page\SettingsPage.xaml">
+      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
+    </EmbeddedResource>
     <EmbeddedResource Update="Properties\Resources.resx">
       <Generator>ResXFileCodeGenerator</Generator>
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>
diff --git a/Borepin/Borepin/Page/BorpinMasterDetailPage.xaml b/Borepin/Borepin/Page/BorpinMasterDetailPage.xaml
new file mode 100644
index 0000000..013e144
--- /dev/null
+++ b/Borepin/Borepin/Page/BorpinMasterDetailPage.xaml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
+             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+             x:Class="Borepin.Page.BorpinMasterDetailPage"
+             xmlns:pages="clr-namespace:Borepin.Page">
+    <MasterDetailPage.Master>
+        <pages:BorpinMasterPage BindingContext="{Binding BorpinMasterPM}" />
+    </MasterDetailPage.Master>
+    <MasterDetailPage.Detail>
+        <NavigationPage>
+            <x:Arguments>
+                <pages:MachinesPage BindingContext="{Binding MachinePM}" />
+            </x:Arguments>
+        </NavigationPage>
+    </MasterDetailPage.Detail>
+</MasterDetailPage>
\ No newline at end of file
diff --git a/Borepin/Borepin/Page/BorpinMasterDetailPage.xaml.cs b/Borepin/Borepin/Page/BorpinMasterDetailPage.xaml.cs
new file mode 100644
index 0000000..bdcd427
--- /dev/null
+++ b/Borepin/Borepin/Page/BorpinMasterDetailPage.xaml.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xamarin.Forms;
+using Xamarin.Forms.Xaml;
+
+namespace Borepin.Page
+{
+    [XamlCompilation(XamlCompilationOptions.Compile)]
+    public partial class BorpinMasterDetailPage : MasterDetailPage
+    {
+        public BorpinMasterDetailPage()
+        {
+            InitializeComponent();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Borepin/Borepin/Page/BorpinMasterPage.xaml b/Borepin/Borepin/Page/BorpinMasterPage.xaml
new file mode 100644
index 0000000..2547888
--- /dev/null
+++ b/Borepin/Borepin/Page/BorpinMasterPage.xaml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:behaviour="clr-namespace:Borepin.Behaviour"
+             x:Class="Borepin.Page.BorpinMasterPage"
+             Title="Master">
+    <StackLayout>
+        <ListView x:Name="MasterMenuListView"
+            SeparatorVisibility="None"
+            HasUnevenRows="true"
+            ItemsSource="{Binding MasterMenu}"
+            SelectedItem="{Binding MasterMenu_ItemSelected, Mode=TwoWay}">
+            <ListView.Behaviors>
+                <behaviour:EventToCommandBehavior EventName="ItemSelected" Command="{Binding ShowDetailPageAsyncCommand}" />
+            </ListView.Behaviors>
+            <ListView.Header>
+                <Grid BackgroundColor="#03A9F4">
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition Width="10"/>
+                        <ColumnDefinition Width="*"/>
+                        <ColumnDefinition Width="10"/>
+                    </Grid.ColumnDefinitions>
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="30"/>
+                        <RowDefinition Height="80"/>
+                        <RowDefinition Height="Auto"/>
+                        <RowDefinition Height="10"/>
+                    </Grid.RowDefinitions>
+                    <Label
+                Grid.Column="1"
+                Grid.Row="2"
+                Text="FabAccess"
+                Style="{DynamicResource SubtitleStyle}"/>
+                </Grid>
+            </ListView.Header>
+            <ListView.ItemTemplate>
+                <DataTemplate>
+                    <ViewCell>
+                        <StackLayout Padding="15,10" HorizontalOptions="FillAndExpand">
+                            <Label VerticalOptions="FillAndExpand" 
+                                VerticalTextAlignment="Center" 
+                                Text="{Binding Title}" 
+                                FontSize="24"/>
+                        </StackLayout>
+                    </ViewCell>
+                </DataTemplate>
+            </ListView.ItemTemplate>
+        </ListView>
+    </StackLayout>
+</ContentPage>
diff --git a/Borepin/Borepin/Page/BorpinMasterPage.xaml.cs b/Borepin/Borepin/Page/BorpinMasterPage.xaml.cs
new file mode 100644
index 0000000..e88b29d
--- /dev/null
+++ b/Borepin/Borepin/Page/BorpinMasterPage.xaml.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms;
+using Xamarin.Forms.Xaml;
+
+namespace Borepin.Page
+{
+    [XamlCompilation(XamlCompilationOptions.Compile)]
+    public partial class BorpinMasterPage : ContentPage
+    {
+        public BorpinMasterPage()
+        {
+            InitializeComponent();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Borepin/Borepin/Page/MachinesPage.xaml b/Borepin/Borepin/Page/MachinesPage.xaml
new file mode 100644
index 0000000..2aaf35a
--- /dev/null
+++ b/Borepin/Borepin/Page/MachinesPage.xaml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+             x:Class="Borepin.Page.MachinesPage"
+             Title="Machines">
+    <StackLayout Padding="10">
+        <Label Text="Site about the Machines"/>
+    </StackLayout>
+</ContentPage>
\ No newline at end of file
diff --git a/Borepin/Borepin/Page/MachinesPage.xaml.cs b/Borepin/Borepin/Page/MachinesPage.xaml.cs
new file mode 100644
index 0000000..83d1f70
--- /dev/null
+++ b/Borepin/Borepin/Page/MachinesPage.xaml.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms;
+using Xamarin.Forms.Xaml;
+
+namespace Borepin.Page
+{
+    [XamlCompilation(XamlCompilationOptions.Compile)]
+    public partial class MachinesPage : ContentPage
+    {
+        public MachinesPage()
+        {
+            InitializeComponent();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Borepin/Borepin/Page/MasterMenuItem.cs b/Borepin/Borepin/Page/MasterMenuItem.cs
new file mode 100644
index 0000000..8551311
--- /dev/null
+++ b/Borepin/Borepin/Page/MasterMenuItem.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Borepin.Page
+{
+
+    public class MasterMenuItem
+    {
+        public MasterMenuItem()
+        {
+            TargetType = typeof(MasterMenuItem);
+        }
+        public int Id { get; set; }
+        public string Title { get; set; }
+
+        public Type TargetType { get; set; }
+    }
+}
\ No newline at end of file
diff --git a/Borepin/Borepin/Page/SettingsPage.xaml b/Borepin/Borepin/Page/SettingsPage.xaml
new file mode 100644
index 0000000..554a3db
--- /dev/null
+++ b/Borepin/Borepin/Page/SettingsPage.xaml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+             x:Class="Borepin.Page.SettingsPage"
+             Title="Settings">
+    <ContentPage.Content>
+        <StackLayout>
+            <Label Text="Site about the Settings"/>
+        </StackLayout>
+    </ContentPage.Content>
+</ContentPage>
\ No newline at end of file
diff --git a/Borepin/Borepin/Page/SettingsPage.xaml.cs b/Borepin/Borepin/Page/SettingsPage.xaml.cs
new file mode 100644
index 0000000..93d965a
--- /dev/null
+++ b/Borepin/Borepin/Page/SettingsPage.xaml.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms;
+using Xamarin.Forms.Xaml;
+
+namespace Borepin.Page
+{
+    [XamlCompilation(XamlCompilationOptions.Compile)]
+    public partial class SettingsPage : ContentPage
+    {
+        public SettingsPage()
+        {
+            InitializeComponent();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Borepin/Borepin/PageModel/BorpinMasterDetailPageModel.cs b/Borepin/Borepin/PageModel/BorpinMasterDetailPageModel.cs
new file mode 100644
index 0000000..423f368
--- /dev/null
+++ b/Borepin/Borepin/PageModel/BorpinMasterDetailPageModel.cs
@@ -0,0 +1,48 @@
+using Borepin.Base;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Borepin.PageModel
+{
+    public class BorpinMasterDetailPageModel : PageModelBase
+    {
+        public BorpinMasterDetailPageModel(BorpinMasterPageModel borpinMasterPM, MachinesPageModel machinesPM, SettingsPageModel settingsPM)
+        {
+            BorpinMasterPM = borpinMasterPM;
+            MachinesPM = machinesPM;
+            SettingsPM = settingsPM;
+        }
+
+        private BorpinMasterPageModel _BorpinMasterPM;
+        public BorpinMasterPageModel BorpinMasterPM
+        {
+            get => _BorpinMasterPM;
+            set => SetProperty(ref _BorpinMasterPM, value);
+        }
+
+        private MachinesPageModel _MachinesPM;
+        public MachinesPageModel MachinesPM
+        {
+            get => _MachinesPM;
+            set => SetProperty(ref _MachinesPM, value);
+        }
+
+        private SettingsPageModel _SettingsPM;
+        public SettingsPageModel SettingsPM
+        {
+            get => _SettingsPM;
+            set => SetProperty(ref _SettingsPM, value);
+        }
+
+        public override Task InitializeAsync(object navigationData)
+        {
+            return Task.WhenAny(
+                base.InitializeAsync(navigationData),
+                BorpinMasterPM.InitializeAsync(null),
+                MachinesPM.InitializeAsync(null),
+                SettingsPM.InitializeAsync(null));
+        }
+    }
+}
diff --git a/Borepin/Borepin/PageModel/BorpinMasterPageModel.cs b/Borepin/Borepin/PageModel/BorpinMasterPageModel.cs
new file mode 100644
index 0000000..1925876
--- /dev/null
+++ b/Borepin/Borepin/PageModel/BorpinMasterPageModel.cs
@@ -0,0 +1,76 @@
+using Borepin.Base;
+using Borepin.Page;
+using Borepin.Service.Navigation;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Input;
+using System.Xml.Schema;
+using Xamarin.Forms;
+
+namespace Borepin.PageModel
+{
+    public class BorpinMasterPageModel : PageModelBase
+    {
+        private INavigationService _NavigationService;
+
+        public BorpinMasterPageModel(INavigationService navigationService)
+        {
+            _NavigationService = navigationService;
+            MasterMenu = new ObservableCollection<MasterMenuItem>()
+            {
+                new MasterMenuItem{ Id = 0, Title = "Machines" },
+                new MasterMenuItem{ Id = 1, Title = "Settings" }
+            };
+
+            _showDetailPageAsyncCommand = new Command(ShowDetailPageAsync);
+        }
+
+        private ObservableCollection<MasterMenuItem> _MasterMenu;
+        public ObservableCollection<MasterMenuItem> MasterMenu
+        {
+            get => _MasterMenu;
+            set => SetProperty(ref _MasterMenu, value);
+        }
+
+        private MasterMenuItem _MasterMenu_ItemSelected;
+        public MasterMenuItem MasterMenu_ItemSelected
+        {
+            get => _MasterMenu_ItemSelected;
+            set => SetProperty(ref _MasterMenu_ItemSelected, value);
+        }
+
+        private ICommand _showDetailPageAsyncCommand;
+        public ICommand ShowDetailPageAsyncCommand
+        {
+            get => _showDetailPageAsyncCommand;
+            set => SetProperty(ref _showDetailPageAsyncCommand, value);
+        }
+        private async void ShowDetailPageAsync()
+        {
+            switch (MasterMenu_ItemSelected.Title)
+            {
+                case "Machines":
+                    await _NavigationService.NaviagteToAsync<MachinesPageModel>();
+                    break;
+                case "Settings":
+                    await _NavigationService.NaviagteToAsync<SettingsPageModel>();
+                    break;
+                default:
+                    break;
+            }
+
+            if (Application.Current.MainPage is MasterDetailPage masterDetailPage)
+            {
+                masterDetailPage.IsPresented = false;
+            }
+            else if (Application.Current.MainPage is NavigationPage navigationPage
+                     && navigationPage.CurrentPage is MasterDetailPage nestedMasterDetail)
+            {
+                nestedMasterDetail.IsPresented = false;
+            }
+        }
+    }
+}
diff --git a/Borepin/Borepin/PageModel/MachinesPageModel.cs b/Borepin/Borepin/PageModel/MachinesPageModel.cs
new file mode 100644
index 0000000..23cd7f6
--- /dev/null
+++ b/Borepin/Borepin/PageModel/MachinesPageModel.cs
@@ -0,0 +1,20 @@
+using Borepin.Base;
+using Borepin.Service.Navigation;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Input;
+using Xamarin.Forms;
+
+namespace Borepin.PageModel
+{
+    public class MachinesPageModel : PageModelBase
+    {
+        private INavigationService _NaviagtionService;
+
+        public MachinesPageModel(INavigationService navigationService)
+        {
+            _NaviagtionService = navigationService;
+        }
+    }
+}
diff --git a/Borepin/Borepin/PageModel/SettingsPageModel.cs b/Borepin/Borepin/PageModel/SettingsPageModel.cs
new file mode 100644
index 0000000..3f4c29d
--- /dev/null
+++ b/Borepin/Borepin/PageModel/SettingsPageModel.cs
@@ -0,0 +1,12 @@
+using Borepin.Base;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Borepin.PageModel
+{
+    public class SettingsPageModel : PageModelBase
+    {
+
+    }
+}
diff --git a/Borepin/Borepin/Service/Navigation/NavigationService.cs b/Borepin/Borepin/Service/Navigation/NavigationService.cs
index 36f0b6a..eb27bea 100644
--- a/Borepin/Borepin/Service/Navigation/NavigationService.cs
+++ b/Borepin/Borepin/Service/Navigation/NavigationService.cs
@@ -20,11 +20,27 @@ namespace Borepin.Service.Navigation
             Xamarin.Forms.Page page = PageModelLocator.CreatePage(typeof(TPageModelBase));
             if(setRoot)
             {
-                App.Current.MainPage = new NavigationPage(page);
+                if (page is TabbedPage tabbedPage)
+                {
+                    App.Current.MainPage = tabbedPage;
+                }
+                else if(page is MasterDetailPage masterDetailPage)
+                {
+                    App.Current.MainPage = masterDetailPage;
+                }
+                else
+                {
+                    App.Current.MainPage = new NavigationPage(page);
+                }
             }
             else
             {
-                if(App.Current.MainPage is NavigationPage navPage)
+                if (App.Current.MainPage is MasterDetailPage masterDetailPage)
+                {
+                    masterDetailPage.Detail = new NavigationPage(page);
+                }
+
+                if (App.Current.MainPage is NavigationPage navPage)
                 {
                     await navPage.PushAsync(page);
                 }