2017-05-10 50 views
0

我對Xamarin表單和自定義渲染器部分相當陌生。我已經爲datepicker編寫了一個自定義渲染器,並且正在使用xamarin形式。Xamarin表單渲染器不響應事件變化

下面是我的XAML,ViewModel和渲染器類的代碼。

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> 

視圖模型

FROM日期物業:

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命令:

public ICommand FromDateSelectedCommand { get; set; } 
FromDateSelectedCommand = new DelegateCommand<object>(FromDateSelected); 
private void FromDateSelected(object selectedDate) 
{ 
    FromDate = ((DatePicker)selectedDate).Date; 
} 

CustomDatePicker類:​​

public class CustomDatePicker : DatePicker 
{ 

} 

CustomDatePickerRenderer UWP渲染:

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) 
    { 


    } 
} 

我該如何更新日期從渲染器已更改值並將其分配回到我的視圖模型沒有fromdate財產?因爲DateChanged命令根本沒有被調用。我懷疑渲染器的日期更改事件必須通過返回值來完成。

現在,FromDate屬性的默認值始終爲DateTime.Now,並且在選擇器中更改日期時不會更新。

任何幫助,將不勝感激。

+1

在自定義渲染器,該e.NewElement.BindingContext應該是你的視圖模型(雖然這將是一個對象,因此需要轉換)。 –

回答

0

找到解決方案。如下所示設置值會觸發DateChanged事件綁定的命令。在我CustomDatePickerRenderer DateChanged事件我不得不寫下面的線

private void DatePicker_DateChanged(CalendarDatePicker sender, CalendarDatePickerDateChangedEventArgs args) 
{  
    // This line triggered the DateChanged event in view model. 
    Element.Date = args.NewDate.Value.Date; 
}