android - 绑定(bind) TimePicker 和 DatePicker - MVVMCross (Mono For Android)

标签 android datepicker xamarin.android timepicker mvvmcross

如何在 Mono For Android 中将 Time - &/DatePicker 与 MVVMCross 绑定(bind)?

  <TimePicker
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

  <DatePicker
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

以及后面的Properties有哪些类型?对于 Date,可能是 DateTime,对于 TimePicker?或者我们这里是否有属性 foreach 编号,例如日期:年 (INT)、月 (INT) 和日 (INT) = 3 个属性?

停留在这个,没有找到任何例子..

感谢帮助

最佳答案

Android 的 DatePicker API 非常恶心...

但是,绑定(bind)它应该很容易:)

我要做的是添加自定义控件和自定义绑定(bind)。


有关自定义 Droid 控件的一些帮助,请参阅

有关自定义绑定(bind)的其他一些问题,请参阅

和来自 http://slodge.blogspot.co.uk/p/mvvmcross-quicklist.html 的其他链接


Android DatePicker API 显然是 Kermit 在停机期间编写的,因此对于 DatePicker,我可能建议您实现一个 EmiDatePicker 继承自 DatePicker 并整理 API。

这可以提供单个属性和单个事件:

   private bool _initialised;

   public DateTime Value
   {
      get 
      {
         return new DateTime(Year, Month.ToCLRMonthNumber(), DayOfMonth);
      }
      set
      {
         if (_initialised)
         {
             UpdateDate(value.Year, value.Month.ToJavaMonthNumber(), value.DayOfMonth);
         }
         else
         {
             _initialised = true;
             Init(value.Year, value.Month.ToJavaMonthNumber(), value.DayOfMonth, new EmiListener(this));
         }
      }
   }

   public event EventHandler ValueChanged;

哪里:

  • ToJavaMonthNumberToCLRMonthNumber 是 +1、-1 修复的解决方法 - 请参阅 MonthDisplayHelper.NumberOfDaysInMonth returning incorrect value in MonoDroid
  • EmiListener 是 IOnDateChangeListener 的简单实现,用于触发 ValueChanged - 类似于:

    public class EmiListener : Java.Lang.Object, DatePicker.IOnDateChangedListener
    {
        private EmiDatePicker _datePicker;
    
        public EmiListener(EmiDatePicker datePicker)
        {
            _datePicker = datePicker;
        }
    
        public void OnDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth)
        {
            _datePicker.InternalSetValueAndRaiseChanged(new DateTime(year, monthOfYear.ToCLRMonth(), dayOfMonth));
        }
    }
    

完成此操作...然后下一个代码步骤将是添加绑定(bind) - 这很简单:

public class EmiDatePickerValueTargetBinding : MvxPropertyInfoTargetBinding<EmiDatePicker>
{
    public EmiDatePickerValueTargetBinding(object target, PropertyInfo targetPropertyInfo)
        : base(target, targetPropertyInfo)
    {
        var datePicker = View;
        if (datePicker == null)
        {
            MvxBindingTrace.Trace(MvxTraceLevel.Error, "Error - datePicker is null in EmiDatePickerValueTargetBinding");
        }
        else
        {
            datePicker.ValueChanged += DatePickerOnValueChanged;
        }
    }

    public override MvxBindingMode DefaultMode
    {
        get { return MvxBindingMode.TwoWay; }
    }

    private void DatePickerOnValueChanged(object sender, EventArgs args)
    {
        FireValueChanged(View.Value);
    }

    protected override void Dispose(bool isDisposing)
    {
        base.Dispose(isDisposing);
        if (isDisposing)
        {
            var datePicker = View;
            if (datePicker != null)
            {
                datePicker.ValueChanged -= DatePickerOnValueChanged;
            }
        }
    }
}

要注册此绑定(bind),只需将其添加到应用的设置类中即可:

    protected override void FillTargetFactories(Cirrious.MvvmCross.Binding.Interfaces.Bindings.Target.Construction.IMvxTargetBindingFactoryRegistry registry)
    {
        registry.RegisterFactory(new MvxSimplePropertyInfoTargetBindingFactory(
                                     typeof (EmiDatePickerValueTargetBinding), typeof (EmiDatePicker), "Value"));

        base.FillTargetFactories(registry);
    }

此时,您终于可以在 XML 中使用 EmiDatePicker - 尽管为了节省打字时间,我建议使用 XML 缩写 - http://slodge.blogspot.co.uk/2013/02/abbreviated-namespaces-for-your-custom.html


要执行 TimePicker... 还是一样,但我会把它留给你...


以上代码会有错别字,请编辑更正。

如果此代码有效...并且因为它是很多“机械代码”,我很乐意看到它开源(甚至可能推回 MvvmCross)

关于android - 绑定(bind) TimePicker 和 DatePicker - MVVMCross (Mono For Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14829521/

相关文章:

android - 在 native 应用程序中使用 Webrtc

android - 如何将日期传回 DialogFragment

javascript - $(...).datepicker 不是函数 - JQuery - Bootstrap

android - 适用于 MonoDroid 的 Google map 解决方案

xamarin - MvvmCross 初始化

android - 如果在 CardView 中使用,则标记 LinearLayout

android - onResume() 仅当应用程序通过启动器图标启动时才起作用,而不是在安装时按打开按钮

java - 安装错误未知故障

c# - 没有日历可视化的 ASP.NET Datepicker

Xamarin iOS 安装失败