Implementing of viewModel handling for UI

This commit is contained in:
2025-08-19 16:50:53 +02:00
parent 86daaa5133
commit 2f053dfc71
8 changed files with 139 additions and 33 deletions

View File

@ -1,6 +1,6 @@
using Common.Library; using Common.Library;
namespace AdventureWorks.EntityLayer.EntityClasses; namespace AdventureWorks.EntityLayer;
public class User : EntityBase public class User : EntityBase
{ {

View File

@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdventureWorks.EntityLayer"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Library", "Common.Library\Common.Library.csproj", "{FEDB6441-2564-4DD5-A3C9-1B2F0A761BB4}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Library", "Common.Library\Common.Library.csproj", "{FEDB6441-2564-4DD5-A3C9-1B2F0A761BB4}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdventureWorks.ViewModelLayer", "AdventureWorks.ViewModelLayer\AdventureWorks.ViewModelLayer.csproj", "{3E3C685B-CA66-4E12-83BC-B872BC5FD933}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -28,6 +30,10 @@ Global
{FEDB6441-2564-4DD5-A3C9-1B2F0A761BB4}.Debug|Any CPU.Build.0 = Debug|Any CPU {FEDB6441-2564-4DD5-A3C9-1B2F0A761BB4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FEDB6441-2564-4DD5-A3C9-1B2F0A761BB4}.Release|Any CPU.ActiveCfg = Release|Any CPU {FEDB6441-2564-4DD5-A3C9-1B2F0A761BB4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FEDB6441-2564-4DD5-A3C9-1B2F0A761BB4}.Release|Any CPU.Build.0 = Release|Any CPU {FEDB6441-2564-4DD5-A3C9-1B2F0A761BB4}.Release|Any CPU.Build.0 = Release|Any CPU
{3E3C685B-CA66-4E12-83BC-B872BC5FD933}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3E3C685B-CA66-4E12-83BC-B872BC5FD933}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3E3C685B-CA66-4E12-83BC-B872BC5FD933}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3E3C685B-CA66-4E12-83BC-B872BC5FD933}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@ -66,6 +66,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AdventureWorks.EntityLayer\AdventureWorks.EntityLayer.csproj" /> <ProjectReference Include="..\AdventureWorks.EntityLayer\AdventureWorks.EntityLayer.csproj" />
<ProjectReference Include="..\AdventureWorks.ViewModelLayer\AdventureWorks.ViewModelLayer.csproj" />
<ProjectReference Include="..\Common.Library\Common.Library.csproj" /> <ProjectReference Include="..\Common.Library\Common.Library.csproj" />
</ItemGroup> </ItemGroup>

View File

@ -4,13 +4,13 @@
x:Class="AdventureWorks.MAUI.Views.UserDetailView" x:Class="AdventureWorks.MAUI.Views.UserDetailView"
xmlns:partial="clr-namespace:AdventureWorks.MAUI.ViewsPartial" xmlns:partial="clr-namespace:AdventureWorks.MAUI.ViewsPartial"
xmlns:converters="clr-namespace:AdventureWorks.MAUI.Converters" xmlns:converters="clr-namespace:AdventureWorks.MAUI.Converters"
xmlns:vm="clr-namespace:AdventureWorks.EntityLayer.EntityClasses;assembly=AdventureWorks.EntityLayer" xmlns:vm="clr-namespace:AdventureWorks.ViewModelLayer;assembly=AdventureWorks.ViewModelLayer"
x:DataType="vm:User" x:DataType="vm:UserViewModel"
Title="User Information"> Title="User Information">
<ContentPage.Resources> <ContentPage.Resources>
<converters:InvertedBoolConverter x:Key="invertedBoolean" /> <converters:InvertedBoolConverter x:Key="invertedBoolean" />
<vm:User x:Key="viewModel" <!--<vm:User x:Key="viewModel"
LoginId="JohnSmith123" LoginId="JohnSmith123"
FirstName="John222" FirstName="John222"
LastName="Smith" LastName="Smith"
@ -24,11 +24,10 @@
IsEnrolledInHSA="False" IsEnrolledInHSA="False"
IsActive="True" IsActive="True"
BirthDate="10-03-1975" BirthDate="10-03-1975"
/> />-->
</ContentPage.Resources> </ContentPage.Resources>
<Border Style="{StaticResource Border.Page}" <Border Style="{StaticResource Border.Page}" >
BindingContext="{StaticResource viewModel}" >
<ScrollView> <ScrollView>
<Grid RowDefinitions="Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto,Auto, Auto, Auto , Auto" <Grid RowDefinitions="Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto,Auto, Auto, Auto , Auto"
ColumnDefinitions="Auto, *" ColumnDefinitions="Auto, *"
@ -45,7 +44,7 @@
<VerticalStackLayout Grid.Row="1" <VerticalStackLayout Grid.Row="1"
Grid.Column="1"> Grid.Column="1">
<Entry Text="{Binding LoginId}" <Entry Text="{Binding UserObject.LoginId}"
Placeholder="Please use a combination of letters and numbers."/> Placeholder="Please use a combination of letters and numbers."/>
<Label FontSize="Micro" <Label FontSize="Micro"
Text="Please use a combination of letters and numbers." /> Text="Please use a combination of letters and numbers." />
@ -54,17 +53,17 @@
Text="First Name" /> Text="First Name" />
<Entry Grid.Row="2" <Entry Grid.Row="2"
Grid.Column="1" Grid.Column="1"
Text="{Binding FirstName}"/> Text="{Binding UserObject.FirstName}"/>
<Label Grid.Row="3" <Label Grid.Row="3"
Text="Last Name" /> Text="Last Name" />
<Entry Grid.Row="3" <Entry Grid.Row="3"
Grid.Column="1" Grid.Column="1"
Text="{Binding LastName}"/> Text="{Binding UserObject.LastName}"/>
<Label Grid.Row="4" <Label Grid.Row="4"
Text="Email Address" /> Text="Email Address" />
<Entry Grid.Row="4" <Entry Grid.Row="4"
Grid.Column="1" Grid.Column="1"
Text="{Binding Email}"/> Text="{Binding UserObject.Email}"/>
<Label Grid.Row="5" Text="Is Enrolled ?"/> <Label Grid.Row="5" Text="Is Enrolled ?"/>
<FlexLayout Grid.Row="5" <FlexLayout Grid.Row="5"
@ -73,19 +72,19 @@
Direction="Row"> Direction="Row">
<HorizontalStackLayout> <HorizontalStackLayout>
<Label Text="401k?"/> <Label Text="401k?"/>
<CheckBox IsChecked="{Binding IsEnrolledIn401k}"/> <CheckBox IsChecked="{Binding UserObject.IsEnrolledIn401k}"/>
</HorizontalStackLayout> </HorizontalStackLayout>
<HorizontalStackLayout > <HorizontalStackLayout >
<Label Text="Flex Time?"/> <Label Text="Flex Time?"/>
<CheckBox x:Name="FlexTime" IsChecked="{Binding IsEnrolledInFlexTime}"/> <CheckBox x:Name="FlexTime" IsChecked="{Binding UserObject.IsEnrolledInFlexTime}"/>
</HorizontalStackLayout> </HorizontalStackLayout>
<HorizontalStackLayout > <HorizontalStackLayout >
<Label Text="Health Care?"/> <Label Text="Health Care?"/>
<CheckBox IsChecked="{Binding IsEnrolledInHealthCare}"/> <CheckBox IsChecked="{Binding UserObject.IsEnrolledInHealthCare}"/>
</HorizontalStackLayout> </HorizontalStackLayout>
<HorizontalStackLayout > <HorizontalStackLayout >
<Label Text="Health Savings Account?"/> <Label Text="Health Savings Account?"/>
<CheckBox IsChecked="{Binding IsEnrolledInHSA}"/> <CheckBox IsChecked="{Binding UserObject.IsEnrolledInHSA}"/>
</HorizontalStackLayout> </HorizontalStackLayout>
</FlexLayout> </FlexLayout>
@ -93,7 +92,7 @@
Text="Still Employed"/> Text="Still Employed"/>
<Switch Grid.Row="6" <Switch Grid.Row="6"
Grid.Column="1" Grid.Column="1"
IsToggled="{Binding IsActive}"/> IsToggled="{Binding UserObject.IsActive}"/>
<Label Text="Employee Type" <Label Text="Employee Type"
Grid.Row="7"/> Grid.Row="7"/>
<FlexLayout Grid.Row="7" <FlexLayout Grid.Row="7"
@ -103,12 +102,12 @@
<HorizontalStackLayout> <HorizontalStackLayout>
<Label Text="Full-Time"/> <Label Text="Full-Time"/>
<RadioButton x:Name="FullTime" <RadioButton x:Name="FullTime"
IsChecked="{Binding IsFullTime}" IsChecked="{Binding UserObject.IsFullTime}"
GroupName="EmployeeType"/> GroupName="EmployeeType"/>
</HorizontalStackLayout> </HorizontalStackLayout>
<HorizontalStackLayout> <HorizontalStackLayout>
<Label Text="Part-Time"/> <Label Text="Part-Time"/>
<RadioButton GroupName="EmployeeType" IsChecked="{Binding IsFullTime, Converter={StaticResource invertedBoolean}}"/> <RadioButton GroupName="EmployeeType" IsChecked="{Binding UserObject.IsFullTime, Converter={StaticResource invertedBoolean}}"/>
</HorizontalStackLayout> </HorizontalStackLayout>
</FlexLayout> </FlexLayout>
@ -116,14 +115,14 @@
Grid.Row="8"/> Grid.Row="8"/>
<DatePicker Grid.Row="8" <DatePicker Grid.Row="8"
Grid.Column="1" Grid.Column="1"
Date="{Binding BirthDate}" Date="{Binding UserObject.BirthDate}"
HorizontalOptions="Start"/> HorizontalOptions="Start"/>
<Label Text="Start Time" <Label Text="Start Time"
Grid.Row="9"/> Grid.Row="9"/>
<TimePicker Grid.Row="9" <TimePicker Grid.Row="9"
Grid.Column="1" Grid.Column="1"
Time="{Binding StartTime}" Time="{Binding UserObject.StartTime}"
IsEnabled="{Binding IsFullTime, Converter={StaticResource invertedBoolean}}"/> IsEnabled="{Binding UserObject.IsFullTime, Converter={StaticResource invertedBoolean}}"/>
<Label Text="Phone" <Label Text="Phone"
Grid.Row="10"/> Grid.Row="10"/>
@ -133,11 +132,11 @@
Direction="Row"> Direction="Row">
<HorizontalStackLayout> <HorizontalStackLayout>
<Entry MinimumWidthRequest="120" <Entry MinimumWidthRequest="120"
Text="{Binding Phone}"/> Text="{Binding UserObject.Phone}"/>
</HorizontalStackLayout> </HorizontalStackLayout>
<HorizontalStackLayout> <HorizontalStackLayout>
<Picker ItemsSource="{StaticResource phoneTypes}" <Picker ItemsSource="{StaticResource UserObject.phoneTypes}"
SelectedItem="{Binding PhoneType}"/> SelectedItem="{Binding UserObject.PhoneType}"/>
</HorizontalStackLayout> </HorizontalStackLayout>
</FlexLayout> </FlexLayout>

View File

@ -1,5 +1,4 @@
using AdventureWorks.EntityLayer.EntityClasses; using AdventureWorks.ViewModelLayer;
namespace AdventureWorks.MAUI.Views; namespace AdventureWorks.MAUI.Views;
public partial class UserDetailView : ContentPage public partial class UserDetailView : ContentPage
@ -7,20 +6,20 @@ public partial class UserDetailView : ContentPage
public UserDetailView() public UserDetailView()
{ {
InitializeComponent(); InitializeComponent();
UserObject = (User)this.Resources["viewModel"];
UserObject.LoginId = "jkzxck0q94375";
} }
public User UserObject { get; set; } public UserViewModel ViewModel { get; set; }
protected override void OnAppearing() protected override void OnAppearing()
{ {
base.OnAppearing(); base.OnAppearing();
UserObject.LoginId = "PeterPiper384"; ViewModel = new();
UserObject.FirstName = "Peter";
UserObject.LastName = "Piper"; BindingContext = ViewModel;
UserObject.Email = "peter@piper.com";
ViewModel.Get(1); // Assuming you want to get the user with ID 1
} }
private void SaveButton_Clicked(object sender, EventArgs e) private void SaveButton_Clicked(object sender, EventArgs e)
{ {

View File

@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\AdventureWorks.EntityLayer\AdventureWorks.EntityLayer.csproj" />
<ProjectReference Include="..\Common.Library\Common.Library.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,81 @@
using AdventureWorks.EntityLayer;
using Common.Library;
using System.Collections.ObjectModel;
namespace AdventureWorks.ViewModelLayer;
public class UserViewModel : ViewModelBase
{
#region Private Variables
private User? _UserObject = new();
#endregion
#region public Properties
public User? UserObject
{
get { return _UserObject; }
set
{
_UserObject = value;
RaisePropertyChanged(nameof(UserObject));
}
}
#endregion
#region Get Method
public ObservableCollection<User> Get()
{
return new();
}
#endregion
#region Get(id) Method
public User? Get(int id)
{
try
{
UserObject = new User
{
UserId = id,
LoginId = "SallyJones615",
FirstName = "Sally",
LastName = "Jones",
Email = "sally@jones.com",
Password = "password123",
Phone = "555-1234",
PhoneType = "Mobile",
IsFullTime = true,
IsEnrolledIn401k = false,
IsEnrolledInFlexTime = false,
IsEnrolledInHealthCare = true,
IsEnrolledInHSA = false,
IsActive = true,
BirthDate = Convert.ToDateTime("1975-11-04"),
StartTime = new TimeSpan(8, 0, 0)
};
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"Error in Get method: {ex.Message}");
}
return UserObject;
}
#endregion
#region Save Method
public virtual bool Save()
{
System.Diagnostics.Debugger.Break();
return true;
}
#endregion
}

View File

@ -0,0 +1,6 @@

namespace Common.Library;
public class ViewModelBase : CommonBase
{
}