public abstract class ChangeWorkoutViewModel : BaseViewModel
{
private WorkoutViewModel currentWorkout;
+ private ICommand previousWorkout;
+ private ICommand nextWorkout;
/// <summary>
/// Initializes a new instance of the <see cref="ChangeWorkoutViewModel"/> class.
/// </summary>
public ChangeWorkoutViewModel()
{
- PreviousWorkout = new Command(GoPrevious);
- NextWorkout = new Command(GoNext);
-
Workouts = WorkoutRepository.Instance.GetAll();
}
{
currentWorkout = value;
RaisePropertyChanged();
+
+ UpdateeWorkoutNavigation();
}
}
}
/// <summary>
/// Gets previous workout.
/// </summary>
- public ICommand PreviousWorkout { get; private set; }
+ public ICommand PreviousWorkout
+ {
+ get => previousWorkout;
+ protected set
+ {
+ if (value != previousWorkout)
+ {
+ previousWorkout = value;
+ RaisePropertyChanged();
+ }
+ }
+ }
/// <summary>
/// Gets next workout.
/// </summary>
- public ICommand NextWorkout { get; private set; }
+ public ICommand NextWorkout
+ {
+ get => nextWorkout;
+ protected set
+ {
+ if (value != nextWorkout)
+ {
+ nextWorkout = value;
+ RaisePropertyChanged();
+ }
+ }
+ }
/// <summary>
/// Gets list of all available workouts.
/// <summary>
/// Go to next workout.
/// </summary>
- protected virtual void GoNext()
+ protected virtual ICommand GetGoNext()
{
- MoveBy(1);
+ if (Workouts.IndexOf(CurrentWorkout) + 1 >= Workouts.Count)
+ {
+ return null;
+ }
+
+ return new Command(() => MoveBy(1));
}
/// <summary>
/// Go to previous workout.
/// </summary>
- protected virtual void GoPrevious()
+ protected virtual ICommand GetGoPrevious()
{
- MoveBy(-1);
+ if (Workouts.IndexOf(CurrentWorkout) - 1 < 0)
+ {
+ return null;
+ }
+
+ return new Command(() => MoveBy(-1));
}
private void MoveBy(int offset)
CurrentWorkout = Workouts[idx];
}
}
+
+ private void UpdateeWorkoutNavigation()
+ {
+ PreviousWorkout = GetGoPrevious();
+ NextWorkout = GetGoNext();
+ }
}
}
public IExerciseService SquatService { get; private set; }
/// <inheritdoc />
- protected override void GoPrevious() => ConfirmChangeWorkout(-1);
+ protected override ICommand GetGoPrevious()
+ {
+ if (Workouts.IndexOf(CurrentWorkout) - 1 < 0)
+ {
+ return null;
+ }
+
+ return new Command(() => ConfirmChangeWorkout(-1));
+ }
/// <inheritdoc />
- protected override void GoNext() => ConfirmChangeWorkout(1);
+ protected override ICommand GetGoNext()
+ {
+ if (Workouts.IndexOf(CurrentWorkout) + 1 >= Workouts.Count)
+ {
+ return null;
+ }
+
+ return new Command(() => ConfirmChangeWorkout(1));
+ }
private void ConfirmChangeWorkout(int offset)
{
--- /dev/null
+using System;
+using System.Globalization;
+using Tizen.NUI.Binding;
+
+namespace Fitness.Views.Converters
+{
+ public class CommandToBoolConverter : IValueConverter
+ {
+ public static CommandToBoolConverter Converter => new CommandToBoolConverter();
+
+ public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+ {
+ return value is Command;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
xmlns:nui="clr-namespace:Tizen.NUI.Components;assembly=Tizen.NUI.Components"
xmlns:styles="clr-namespace:Fitness.Views.Styles"
xmlns:behaviors="clr-namespace:Fitness.Views.Behaviors"
+ xmlns:converters="clr-namespace:Fitness.Views.Converters"
WidthSpecification="{Static LayoutParamPolicies.MatchParent}"
Size="{views:SizeInUnits Height=30}"
x:Name="Root">
x:Name="prev"
Position="{views:PositionInUnits X=17, Y=10}"
Size="{views:SizeInUnits Width=64, Height=20}"
+ IsEnabled="{Binding PreviousWorkout, Converter={x:Static converters:CommandToBoolConverter.Converter}}"
behaviors:StyleSetter.Style="{x:Static styles:Buttons.Previous}"/>
<TextLabel x:Name="title"
x:Name="next"
Position="{views:PositionInUnits X=400, Y=10}"
Size="{views:SizeInUnits Width=64, Height=20}"
+ IsEnabled="{Binding NextWorkout, Converter={x:Static converters:CommandToBoolConverter.Converter}}"
behaviors:StyleSetter.Style="{x:Static styles:Buttons.Next}"/>
</View>
xmlns="http://tizen.org/Tizen.NUI/2018/XAML"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:ctrl="clr-namespace:Fitness.Controls"
+ xmlns:converters="clr-namespace:Fitness.Views.Converters"
xmlns:vm="clr-namespace:Fitness.ViewModels"
xmlns:views="clr-namespace:Fitness.Views"
xmlns:nui="clr-namespace:Tizen.NUI.Components;assembly=Tizen.NUI.Components"
Text="previous"
x:Name="previousButton"
Command="{Binding PreviousWorkout}"
+ IsEnabled="{Binding PreviousWorkout, Converter={x:Static converters:CommandToBoolConverter.Converter}}"
behaviors:StyleSetter.Style="{x:Static styles:Buttons.Previous}"/>
<TextLabel BindingContext="{Binding Source={x:Reference context}, Path=CurrentWorkout}"
x:Name="nextButton"
Margin="{views:ExtentsInUnits Start=10}"
Command="{Binding NextWorkout}"
+ IsEnabled="{Binding NextWorkout, Converter={x:Static converters:CommandToBoolConverter.Converter}}"
behaviors:StyleSetter.Style="{x:Static styles:Buttons.Next}"/>
</View>