0
votes

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.

1
In the custom renderer, the e.NewElement.BindingContext should be your view model (although it will be an object, so need to cast).App Pack

1 Answers

0
votes

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;
}