2

Android用MonoでTime-&/ DatePickerをMVVMCrossにバインドする方法は?

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

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

そして、背後にあるプロパティの種類は何ですか?Dateの場合、おそらくDateTimeとTimePickerの場合ですか?または、ここに番号のプロパティがありますか?たとえば、日付:年(INT)、月(INT)、日(INT)= 3プロパティですか?

これで立ち往生し、例が見つかりませんでした。

感謝するのを手伝ってください

4

1 に答える 1

1

AndroidのDatePickerAPIはかなり嫌です...

ただし、バインドは非常に簡単です:)

私がすることは、カスタムコントロールとカスタムバインディングを追加することです。


カスタムドロイドコントロールのヘルプについては、を参照してください。

カスタムバインディングに関するその他の質問については、を参照してください。

およびhttp://slodge.blogspot.co.uk/p/mvvmcross-quicklist.htmlからの他のリンク


Android DatePickerAPIは、ダウンタイム中にKermitによって明確に作成されたため、APIを継承し、APIを整理するDatePickerを実装することをお勧めします。EmiDatePickerDatePicker

これにより、単一のプロパティと単一のイベントを提供できます。

   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の修正の回避策です-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にプッシュバックされるかもしれません)

于 2013-02-12T11:27:51.390 に答える