如何在 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 控件的一些帮助,请参阅
- How to create view's actions listener for MvxItemTemplate
- 看看http://github.com/CheeseBaron/ repo - 他做了很多很棒的自定义控件
有关自定义绑定(bind)的其他一些问题,请参阅
- 自定义收藏夹按钮绑定(bind) - MVVMCross Bindings in Android
- 自定义文本颜色绑定(bind) - In MvvmCross how do I do custom bind properties
- 整数的双向绑定(bind) - MvvmCross Monotouch C# - Binding Int Property - Mode: TwoWay
- 触摸事件的自定义绑定(bind) - mvvmcross touch command binding in android
和来自 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;
哪里:
ToJavaMonthNumber
、ToCLRMonthNumber
是 +1、-1 修复的解决方法 - 请参阅 MonthDisplayHelper.NumberOfDaysInMonth returning incorrect value in MonoDroidEmiListener 是
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/