AndroidのDatePickerAPIはかなり嫌です...
ただし、バインドは非常に簡単です:)
私がすることは、カスタムコントロールとカスタムバインディングを追加することです。
カスタムドロイドコントロールのヘルプについては、を参照してください。
カスタムバインディングに関するその他の質問については、を参照してください。
およびhttp://slodge.blogspot.co.uk/p/mvvmcross-quicklist.htmlからの他のリンク
Android DatePicker
APIは、ダウンタイム中にKermitによって明確に作成されたため、APIを継承し、APIを整理するDatePicker
を実装することをお勧めします。EmiDatePicker
DatePicker
これにより、単一のプロパティと単一のイベントを提供できます。
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の修正の回避策です-MontoDroidで誤った値を返すMonthDisplayHelper.NumberOfDaysInMonthを参照してください
EmiListenerは、ValueChangedを起動するための単純な実装ですIOnDateChangeListener
-次のようなものです。
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));
}
}
これが完了すると...次のコードステップはバインディングを追加することです-これは簡単です:
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;
}
}
}
}
そして、このバインディングを登録するには、アプリのセットアップクラスに追加するだけです。
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にプッシュバックされるかもしれません)