2017-05-10 20 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> 

ビューモデル

FROMDATEプロパティ:

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

を書かなければならなかった私のCustomDatePickerRenderer DateChangedイベントでは、e.NewElement.BindingContextはあなたのビューモデルでなければなりません。 –

答えて

0

解決策が見つかりました。値を次のように設定すると、DateChangedイベントがバインドされたコマンドがトリガーされました。 (それはオブジェクトであるので、キャストする必要がありますが)私は、カスタムレンダラでは、以下の行

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