Xamarin Forms 渲染器未响应事件更改

Posted

技术标签:

【中文标题】Xamarin Forms 渲染器未响应事件更改【英文标题】:Xamarin Forms renderer not responding to event change 【发布时间】:2017-10-09 05:45:03 【问题描述】:

我对 Xamarin 表单和自定义渲染器部分很陌生。我已经为 datepicker 编写了一个自定义渲染器,并且在 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 的默认值,并且不会在选择器中更改日期时更新。

对此的任何帮助将不胜感激。

【问题讨论】:

在自定义渲染器中,e.NewElement.BindingContext 应该是你的视图模型(虽然它是一个对象,所以需要强制转换)。 【参考方案1】:

找到了解决办法。如下设置值确实触发了 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;

【讨论】:

以上是关于Xamarin Forms 渲染器未响应事件更改的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms 中 Picker 的自定义渲染器

Xamarin.forms 中的响应式网格

异步事件处理程序有时会挂在 Xamarin.Forms

我们如何处理 Xamarin Forms Picker 的完成按钮单击事件?

如何更改Android中选项卡页面标题的选定和未选定颜色:Xamarin Forms

Xamarin Forms Shell 如何使用自定义渲染器自定义选项卡