diff options
Diffstat (limited to 'Xamarin.Forms.Core/DatePicker.cs')
-rw-r--r-- | Xamarin.Forms.Core/DatePicker.cs | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/Xamarin.Forms.Core/DatePicker.cs b/Xamarin.Forms.Core/DatePicker.cs new file mode 100644 index 00000000..15f1c198 --- /dev/null +++ b/Xamarin.Forms.Core/DatePicker.cs @@ -0,0 +1,99 @@ +using System; +using Xamarin.Forms.Platform; + +namespace Xamarin.Forms +{ + [RenderWith(typeof(_DatePickerRenderer))] + public class DatePicker : View + { + public static readonly BindableProperty FormatProperty = BindableProperty.Create("Format", typeof(string), typeof(DatePicker), "d"); + + public static readonly BindableProperty DateProperty = BindableProperty.Create("Date", typeof(DateTime), typeof(DatePicker), DateTime.Today, BindingMode.TwoWay, coerceValue: CoerceDate, + propertyChanged: DatePropertyChanged); + + public static readonly BindableProperty MinimumDateProperty = BindableProperty.Create("MinimumDate", typeof(DateTime), typeof(DatePicker), new DateTime(1900, 1, 1), + validateValue: ValidateMinimumDate, coerceValue: CoerceMinimumDate); + + public static readonly BindableProperty MaximumDateProperty = BindableProperty.Create("MaximumDate", typeof(DateTime), typeof(DatePicker), new DateTime(2100, 12, 31), + validateValue: ValidateMaximumDate, coerceValue: CoerceMaximumDate); + + public DateTime Date + { + get { return (DateTime)GetValue(DateProperty); } + set { SetValue(DateProperty, value); } + } + + public string Format + { + get { return (string)GetValue(FormatProperty); } + set { SetValue(FormatProperty, value); } + } + + public DateTime MaximumDate + { + get { return (DateTime)GetValue(MaximumDateProperty); } + set { SetValue(MaximumDateProperty, value); } + } + + public DateTime MinimumDate + { + get { return (DateTime)GetValue(MinimumDateProperty); } + set { SetValue(MinimumDateProperty, value); } + } + + public event EventHandler<DateChangedEventArgs> DateSelected; + + static object CoerceDate(BindableObject bindable, object value) + { + var picker = (DatePicker)bindable; + DateTime dateValue = ((DateTime)value).Date; + + if (dateValue > picker.MaximumDate) + dateValue = picker.MaximumDate; + + if (dateValue < picker.MinimumDate) + dateValue = picker.MinimumDate; + + return dateValue; + } + + static object CoerceMaximumDate(BindableObject bindable, object value) + { + DateTime dateValue = ((DateTime)value).Date; + var picker = (DatePicker)bindable; + if (picker.Date > dateValue) + picker.Date = dateValue; + + return dateValue; + } + + static object CoerceMinimumDate(BindableObject bindable, object value) + { + DateTime dateValue = ((DateTime)value).Date; + var picker = (DatePicker)bindable; + if (picker.Date < dateValue) + picker.Date = dateValue; + + return dateValue; + } + + static void DatePropertyChanged(BindableObject bindable, object oldValue, object newValue) + { + var datePicker = (DatePicker)bindable; + EventHandler<DateChangedEventArgs> selected = datePicker.DateSelected; + + if (selected != null) + selected(datePicker, new DateChangedEventArgs((DateTime)oldValue, (DateTime)newValue)); + } + + static bool ValidateMaximumDate(BindableObject bindable, object value) + { + return (DateTime)value >= ((DatePicker)bindable).MinimumDate; + } + + static bool ValidateMinimumDate(BindableObject bindable, object value) + { + return (DateTime)value <= ((DatePicker)bindable).MaximumDate; + } + } +}
\ No newline at end of file |