DefaultViewModel.cs
Home
/
src /
Web /
ViewModels /
DefaultViewModel.cs
namespace Web.ViewModels
{
using System;
using System.Collections.Generic;
public class DefaultViewModel : SiteViewModel
{
public FirstViewModel First { get; set; }
public SecondViewModel Second { get; set; }
public delegate void ToggleNext(bool isEnabled);
public WizardNavigationViewModel Wizard { get; set; }
public DefaultViewModel()
{
Wizard = new WizardNavigationViewModel(new List<string>
{
"First",
"Second"
}, 1);
Initialize();
}
private void Initialize()
{
First = new FirstViewModel();
if (!First.IsInitialized)
First.Initialize(ToggleNextButtonEnabled);
Wizard.NextButtonEnabled = false; // default off until user checks to continue
Wizard.ShowNavigation();
}
public void OnNextClick()
{
Wizard.OnNextClick();
if (Wizard.Step == 2)
{
if (Second == null) // TODO resolve with IOC
Second = new SecondViewModel();
if (!Second.IsInitialized)
Second.Initialize();
}
}
public void OnPreviousClick()
{
Wizard.OnPreviousClick();
}
#region Private Methods
private void ToggleNextButtonEnabled(bool isEnabled)
{
Wizard.NextButtonEnabled = isEnabled;
}
#endregion
}
#region First
public class FirstViewModel
{
public DefaultViewModel.ToggleNext ToggleNext;
public bool IsInitialized { get; set; }
public bool IsNextEnabled { get; set; }
public void Initialize(DefaultViewModel.ToggleNext toggleNext)
{
ToggleNext = toggleNext;
IsInitialized = true;
}
public void OnContinueChanged()
{
ToggleNext?.Invoke(IsNextEnabled);
}
}
#endregion
#region Second
public class SecondViewModel
{
public bool IsInitialized { get; set; }
public bool IsNextEnabled { get; set; }
public void Initialize()
{
IsInitialized = true;
}
}
#endregion
#region Wizard Navigation
public class WizardNavigationViewModel
{
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 NavigationVisible { 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 HideNavigation() => NavigationVisible = false;
public void OnNextClick()
{
if (Step >= Total)
return;
PreviousStep = Step;
Step++;
SetButtonStatus();
}
public void OnPreviousClick()
{
if (Step <= MinimumStep)
return;
PreviousStep = Step;
Step--;
SetButtonStatus();
}
public void ShowNavigation() => NavigationVisible = true;
#region Private Methods
private void SetButtonStatus()
{
NextButtonEnabled = Step < Total;
PreviousButtonEnabled = Step > MinimumStep;
}
#endregion
}
#endregion
}