mirror of
https://dev.azure.com/TeilRad/sharee.bike%20App/_git/Code
synced 2024-12-22 23:26:31 +01:00
110 lines
No EOL
3.2 KiB
C#
110 lines
No EOL
3.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using ShareeSharedGuiLib.ViewModel;
|
|
using Xamarin.Forms;
|
|
using Xamarin.Forms.Xaml;
|
|
|
|
namespace ShareeSharedGuiLib.View
|
|
{
|
|
[XamlCompilation(XamlCompilationOptions.Compile)]
|
|
public partial class BarLevelInputView : ContentView
|
|
{
|
|
private BarLevelInputViewModel _LocalViewModel;
|
|
|
|
public BarLevelInputView()
|
|
{
|
|
InitializeComponent();
|
|
|
|
_LocalViewModel = new BarLevelInputViewModel();
|
|
|
|
_LocalViewModel.PropertyChanged += (sender, args) =>
|
|
{
|
|
// Update Current property from view model on user input.
|
|
if (args.PropertyName != nameof(BarLevelInputViewModel.Current))
|
|
return;
|
|
|
|
var viewModel = sender as BarLevelInputViewModel;
|
|
Current = viewModel?.Current != null
|
|
? viewModel?.Current.Value.ToString()
|
|
: String.Empty;
|
|
};
|
|
|
|
// Do not bind entire control to local view model. Doing this would break binding of BatteryView control.
|
|
this.BarLevelElement.BindingContext = _LocalViewModel;
|
|
this.BarLevelStepper.BindingContext = _LocalViewModel;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Create bindable property to to allow "Maximum"- proptery to act as a valid target for data binding.
|
|
/// </summary>
|
|
public static readonly BindableProperty MaximumProperty = BindableProperty.Create(
|
|
"Maximum",
|
|
typeof(string),
|
|
typeof(BarLevelInputView),
|
|
"7",
|
|
propertyChanged: OnMaximumChanged);
|
|
|
|
/// <summary>
|
|
/// Holds the count of bars wich represent charing level full.
|
|
/// </summary>
|
|
public string Maximum
|
|
{
|
|
get => (string)GetValue(MaximumProperty);
|
|
set => SetValue(MaximumProperty, value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Notifies when value changes. Is required to make binding work.
|
|
/// </summary>
|
|
static void OnMaximumChanged(BindableObject bindable, object oldValue, object newValue)
|
|
{
|
|
if (newValue != oldValue)
|
|
{
|
|
var batteryView = bindable as BarLevelInputView;
|
|
batteryView?.SetMaximum(int.TryParse(newValue.ToString(), out int maximum) ? (int?)maximum : null);
|
|
}
|
|
}
|
|
|
|
public void SetMaximum(int? maximum) => _LocalViewModel.Maximum = maximum;
|
|
|
|
|
|
/// <summary>
|
|
/// Create bindable property to to allow "Current"- proptery to act as a valid target for data binding.
|
|
/// </summary>
|
|
public static readonly BindableProperty CurrentProperty = BindableProperty.Create(
|
|
"Current",
|
|
typeof(string),
|
|
typeof(BarLevelInputView),
|
|
"7",
|
|
BindingMode.TwoWay,
|
|
propertyChanged: OnCurrentChanged);
|
|
|
|
/// <summary>
|
|
/// Holds the count of bars wich represent the current charing level.
|
|
/// </summary>
|
|
public string Current
|
|
{
|
|
get => (string)GetValue(CurrentProperty);
|
|
set => SetValue(CurrentProperty, value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Notifies when value changes. Is required to make binding work.
|
|
/// </summary>
|
|
static void OnCurrentChanged(BindableObject bindable, object oldValue, object newValue)
|
|
{
|
|
if (newValue != oldValue)
|
|
{
|
|
var batteryView = bindable as BarLevelInputView;
|
|
int current;
|
|
batteryView?.SetCurrent(int.TryParse(newValue.ToString(), out current) ? (int?)current : null);
|
|
}
|
|
}
|
|
|
|
public void SetCurrent(int? current) => _LocalViewModel.Current = current;
|
|
|
|
}
|
|
} |