115 lines
3.5 KiB
C#
115 lines
3.5 KiB
C#
using ZicMoove.Extensions;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using Xamarin.Forms;
|
|
|
|
namespace ZicMoove.Views
|
|
{
|
|
/// <summary>
|
|
/// A control for picking an element from an enumerated type.
|
|
/// </summary>
|
|
public class EnumPicker : Picker
|
|
{
|
|
#region Static Fields
|
|
/// <summary>
|
|
/// The source used to build values for this picker
|
|
/// is any enum value from the desired enum type
|
|
/// </summary>
|
|
public static BindableProperty EnumSourceProperty =
|
|
BindableProperty.Create(
|
|
"EnumSource", typeof(Enum), typeof(EnumPicker),
|
|
default(Enum), BindingMode.OneWay, propertyChanged: OnEnumSourceChanged);
|
|
|
|
public static BindableProperty SelectedItemProperty =
|
|
BindableProperty.Create("SelectedItem", typeof(Enum), typeof(EnumPicker),
|
|
default(Enum), BindingMode.TwoWay, null, propertyChanged: OnSelectedItemChanged);
|
|
|
|
#endregion
|
|
|
|
#region Constructors and Destructors
|
|
|
|
public EnumPicker()
|
|
{
|
|
this.SelectedIndexChanged += this.OnSelectedIndexChanged;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Public Properties
|
|
|
|
public Enum EnumSource
|
|
{
|
|
get
|
|
{
|
|
return (Enum)this.GetValue(EnumSourceProperty);
|
|
}
|
|
set
|
|
{
|
|
this.SetValue(EnumSourceProperty, value);
|
|
}
|
|
}
|
|
|
|
public Enum SelectedItem
|
|
{
|
|
get
|
|
{
|
|
return (Enum)this.GetValue(SelectedItemProperty);
|
|
}
|
|
set
|
|
{
|
|
this.SetValue(SelectedItemProperty, value);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Methods
|
|
private static void OnEnumSourceChanged(BindableObject bindable, object oldValue, object newValue)
|
|
{
|
|
var picker = bindable as EnumPicker;
|
|
if (picker == null)
|
|
{
|
|
return;
|
|
}
|
|
if (newValue == null)
|
|
{
|
|
return;
|
|
}
|
|
// Find the values not already contained in the Picker's list of items.
|
|
var items = EnumExtensions.GetDescriptions(newValue.GetType());
|
|
var toBeAdded = items.Where(item => !picker.Items.Contains(item));
|
|
foreach (var item in toBeAdded)
|
|
{
|
|
picker.Items.Add(item);
|
|
}
|
|
}
|
|
private static void OnSelectedItemChanged(BindableObject bindable, object oldValue, object newValue)
|
|
{
|
|
var picker = bindable as EnumPicker;
|
|
if (newValue == null || oldValue == newValue || picker == null)
|
|
{
|
|
return;
|
|
}
|
|
picker.SelectedIndex = picker.Items.IndexOf(((Enum)newValue).GetDescription());
|
|
}
|
|
private void OnSelectedIndexChanged(object sender, EventArgs eventArgs)
|
|
{
|
|
var picker = sender as EnumPicker;
|
|
if (null == picker || (this.SelectedIndex < 0 || this.SelectedIndex > this.Items.Count - 1))
|
|
{
|
|
return;
|
|
}
|
|
|
|
var type = this.EnumSource.GetType();
|
|
var values = EnumExtensions.GetDescriptions(type);
|
|
var items = (from object item in values select item).ToList();
|
|
picker.SelectedItem = EnumExtensions.GetEnumFromDescription(items[this.SelectedIndex].ToString(), type);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|