WizardNavigationViewModel.cs
Home
/
src /
Web /
Controls /
WizardNavigation /
WizardNavigationViewModel.cs
namespace Web.Controls.WizardNavigation
{
using DotVVM.Framework.Binding.Expressions;
using DotVVM.Framework.ViewModel;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
public class WizardNavigationViewModel : DotvvmViewModelBase
{
public int MinimumStep { get; set; }
public bool NextButtonEnabled { get; set; }
public bool NextButtonVisible { get; set; }
public double Percentage => ((float)Step / Total) * 100.0;
public int PreviousStep { get; set; }
public bool PreviousButtonEnabled { get; set; }
public bool PreviousButtonVisible { get; set; }
public int Step { get; set; }
public string Title => Titles[Step - 1];
public string[] Titles { get; set; }
public int Total => Titles.Length;
public bool WizardNavigationVisible { get; set; }
public WizardNavigationViewModel(List<string> titles) : this(titles, 1)
{
}
public WizardNavigationViewModel(List<string> titles, int minimumStep)
{
if (titles == null)
throw new ArgumentNullException($"{nameof(titles)} is required.");
if (titles.Count == 0)
throw new ArgumentOutOfRangeException($"{nameof(titles)} is empty.");
MinimumStep = minimumStep;
NextButtonVisible = true;
PreviousButtonVisible = true;
Step = 1;
Titles = titles.ToArray();
if (Total > 1)
NextButtonEnabled = true;
}
public void Hide() => WizardNavigationVisible = false;
public async Task OnNextClickAsync(Command command)
{
if (Step >= Total)
return;
PreviousStep = Step;
Step++;
SetButtonStatus();
await command.Invoke();
}
public async Task OnPreviousClickAsync(Command command)
{
if (Step <= MinimumStep)
return;
PreviousStep = Step;
Step--;
SetButtonStatus();
await command.Invoke();
}
public void Show() => WizardNavigationVisible = true;
#region Private Methods
private void SetButtonStatus()
{
NextButtonEnabled = Step < Total;
PreviousButtonEnabled = Step > MinimumStep;
}
#endregion
}
}