Xamarin Forms Application with design pattern MVVM and CLEAN CODE principles. Available on Android, iOS and Windows platforms
- Microsoft Visual Studio 2019;
- Xamarin Forms Project;
- Microsoft.EntityFrameworkCore.Sqlite : database abstraction layer;
- Microsoft.EntityFrameworkCore.Tools : used for data migration;
- Refractored.MvvmHelpers : used for data binding and synchronous and asynchronous commands;
- Xamarin.Essentials : internet connection verification;
- Shell : page browsing;
- FluentValidation: validation when editing data
Multilingual App Toolkit extension was used to generate the translation files available in \Resources folder for languages:
- English;
- Brazilian portuguese;
<Label Text="{extensions:Translate pokemonTypes}" FontSize="Caption"/>
public class BaseBusiness<TModel> : ObservableObject where TModel : BaseModel, new()
{
...
public IList<ValidationFailure> Erros { get; set; }
public AbstractValidator<TModel> Validator { get; set; }
...
}
public abstract class BaseCollectionViewModel<TModel, TBusiness, TDataManager> :
BaseDataViewModel<TModel, TBusiness, TDataManager> where TModel : BaseModel, new() where
TBusiness : BaseBusiness<TModel>, new() where
TDataManager : BaseManager<TModel>, new()
{ ... }
public partial class BasePage<TViewModel> : ContentPage where TViewModel : ViewModels.BaseViewModel, new()
{ ... }
public class Database : DbContext
{
...
public void Initialize()
{
//Database.EnsureDeleted();
Database.Migrate();
}
}
private void SetAmounPaid(Work model)
{
var start = model.StartHour;
var finish = (model.FinishHour.Hours == 0) ? new TimeSpan(24, 0, 0) : model.FinishHour;
while (start < finish)
{
var payment = paymentsManager.GetPaymentFromTime(start.Add(new TimeSpan(0, 1, 0)), model.DayOfWeek);
if (payment != null)
{
model.AmounPaid += payment.AmounPaid;
}
start = start.Add(new TimeSpan(1, 0, 0));
}
}
Strategy used to use icons, in the action bar, from true type fonts.
- icofont.ttf;
- material.ttf;
Injecting the "views" page navigation service through view model navigation
public partial class App : Application
{
...
public App(string dbPath)
{
...
DependencyService.Register<Interfaces.INavigation, Navigation>();
}
}
public class Navigation : Interfaces.INavigation
{
public async Task<TViewModel> GoToAsync<TViewModel>() where TViewModel : BaseViewModel
{
await Shell.Current.GoToAsync(typeof(TViewModel).Name);
return Shell.Current.CurrentPage.BindingContext as TViewModel;
}
public Task GoToBackAsync()
{
return Shell.Current.GoToAsync("..");
}
}
public abstract class BaseViewModel : MvvmHelpers.BaseViewModel
{
...
public Interfaces.INavigation Navigation =>
DependencyService.Get<Interfaces.INavigation>(DependencyFetchTarget.GlobalInstance);
}
Focus on best programming practices in Xamarin Forms applications.