using SharedGui.ViewModel; using Xamarin.Forms; using Xamarin.Forms.Xaml; namespace SharedGui.View { [XamlCompilation(XamlCompilationOptions.Compile)] public partial class BarLevelView : ContentView { private BarLevelViewModel _LocalViewModel = new BarLevelViewModel(); public BarLevelView() { InitializeComponent(); // Do not bind entire control to local view model. Doing this would break binding of BatteryView control. this.BarLevelLabel.BindingContext = _LocalViewModel; this.BarLevelImage.BindingContext = _LocalViewModel; } /// /// Create bindable property to allow "Maximum"- property to act as a valid target for data binding. /// public static readonly BindableProperty MaximumProperty = BindableProperty.Create( "Maximum", typeof(string), typeof(BarLevelView), "", // Default value must match default value of view model object. Otherwise there might be an update issue. propertyChanged: OnMaximumChanged); /// /// Holds the count of bars which represent charing level full. /// public string Maximum { get => (string)GetValue(MaximumProperty); set => SetValue(MaximumProperty, value); } /// /// Notifies when value changes. Is required to make binding work. /// static void OnMaximumChanged(BindableObject bindable, object oldValue, object newValue) { if (newValue != oldValue) { var batteryView = bindable as BarLevelView; batteryView?.SetMaximum(int.TryParse(newValue.ToString(), out int maximum) ? (int?)maximum : null); } } public void SetMaximum(int? maximum) => _LocalViewModel.Maximum = maximum; /// /// Create bindable property to allow "Current"- property to act as a valid target for data binding. /// public static readonly BindableProperty CurrentProperty = BindableProperty.Create( "Current", typeof(string), typeof(BarLevelView), "", // Default value must match default value of view model object. Otherwise there might be an update issue. propertyChanged: OnCurrentChanged); /// /// Holds the count of bars which represent the current charing level. /// public string Current { get => (string)GetValue(CurrentProperty); set => SetValue(CurrentProperty, value); } /// /// Notifies when value changes. Is required to make binding work. /// static void OnCurrentChanged(BindableObject bindable, object oldValue, object newValue) { if (newValue != oldValue) { var batteryView = bindable as BarLevelView; int current; batteryView?.SetCurrent(int.TryParse(newValue.ToString(), out current) ? (int?)current : null); } } public void SetCurrent(int? current) => _LocalViewModel.Current = current; } }