I am quite new to Xamarin forms and the custom renderer part. I have written a custom renderer for datepicker and the same is being used in xamarin forms.
Below is the code of my XAML , ViewModel and renderer classes.
XAML :
<flightControls:CustomDatePicker x:Name="FromDatePicker" Date="{Binding FromDate}" >
<flightControls:CustomDatePicker.Behaviors>
<behaviour:CommandBehavior EventName="DateSelected" Command="{Binding FromDateSelectedCommand}" CommandParameter="{Binding Source={x:Reference FromDatePicker}}" />
</flightControls:CustomDatePicker.Behaviors>
</flightControls:CustomDatePicker>
View Model
FromDate Property:
private DateTime _fromDate;
public DateTime FromDate
{
get
{
return (_fromDate == default(DateTime)) ? DateTime.Now : _fromDate;
}
set
{
_fromDate = (value == default(DateTime)) ? DateTime.Now : value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("FromDate"));
}
}
FromDateSelectedCommand Command:
public ICommand FromDateSelectedCommand { get; set; }
FromDateSelectedCommand = new DelegateCommand<object>(FromDateSelected);
private void FromDateSelected(object selectedDate)
{
FromDate = ((DatePicker)selectedDate).Date;
}
CustomDatePicker Class:
public class CustomDatePicker : DatePicker
{
}
CustomDatePickerRenderer UWP Renderer:
public class CustomDatePickerRenderer:ViewRenderer<Xamarin.Forms.DatePicker,Windows.UI.Xaml.Controls.CalendarDatePicker>
{
CalendarDatePicker datePicker = new CalendarDatePicker();
/// <summary>
/// OnElement Changed method to get the Native DatePicker element
/// </summary>
/// <param name="e"></param>
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.DatePicker> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
datePicker.PlaceholderText = "Select Date";
datePicker.Date = e.NewElement.Date;
datePicker.PlaceholderText = "dd-mm-yyyy";
datePicker.DateChanged += DatePicker_DateChanged;
SetNativeControl(datePicker);
}
}
private void DatePicker_DateChanged(CalendarDatePicker sender, CalendarDatePickerDateChangedEventArgs args)
{
}
}
How do i get the updated date changed value from renderer and assign it back to the FromDate property of my view model ? Because the DateChanged command is not getting invoked at all. I suspect something has to be done on the renderer's date changed event , by returning a value back.
Right now the FromDate property always has a default value of DateTime.Now and is not getting updated when the date is changed in the picker.
Any help on this would be appreciated.
Found the solution. Setting the value as below did trigger the command the DateChanged event was bound to. In my CustomDatePickerRenderer DateChanged event i had to write the below line
private void DatePicker_DateChanged(CalendarDatePicker sender, CalendarDatePickerDateChangedEventArgs args)
{
// This line triggered the DateChanged event in view model.
Element.Date = args.NewDate.Value.Date;
}