5

MonoDroid で MvvmCross を使用しています。

ビューモデルのタイマーでは、1分ごとに呼び出しますRaisePropertyChanged("MinutesRemaining")-MinutesRemaining現在のエントリが終了するまでの期間を分単位で指定する整数です(はい、これはUIスレッドで呼び出されます!)。

MinutesRemainingTextViewMvvmCross を使用してバインドされます。

Xamarin からの更新まで4.10.1、アプリは完全にクラッシュし、エラー メッセージがトレースに出力されませんでした。現在は、デバッグ時に正しく中断され、PropertyChangedイベントの呼び出し時に次のエラーが表示されます。

MvxBind:Error:281.24 Problem seen during binding execution for binding Text for MinutesRemaining - problem ArgumentException: 'jobject' must not be IntPtr.Zero.
Parameter name: jobject
  at Android.Runtime.JNIEnv.CallVoidMethod (IntPtr jobject, IntPtr jmethod, Android.Runtime.JValue[] parms) [0x00010] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.10.1-branch/9d03ce3e/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:499 
  at Android.Widget.TextView.set_TextFormatted (ICharSequence value) [0x00034] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.10.1-branch/9d03ce3e/source/monodroid/src/Mono.Android/platforms/android-14/src/generated/Android.Widget.TextView.cs:1814 
  at Android.Widget.TextView.set_Text (System.String value) [0x00013] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.10.1-branch/9d03ce3e/source/monodroid/src/Mono.Android/platforms/android-14/src/generated/Android.Widget.TextView.cs:1823 
  at Cirrious.MvvmCross.Binding.Droid.Target.MvxTextViewTextTargetBinding.SetValueImpl (System.Object target, System.Object toSet) [0x00000] in <filename unknown>:0 
  at Cirrious.MvvmCross.Binding.Bindings.Target.MvxConvertingTargetBinding.SetValue (System.Object value) [0x00000] in <filename unknown>:0 
  at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource (System.Object value) [0x00000] in <filename unknown>:0 

最初は正しくバインドされRaisePropertyChangedます。これが発生するのは、後続の呼び出しのみです。同じコードが Windows 8 と Windows Phone でも機能します。

アップデート

上記のシナリオで使用したアダプターで JavaFinalise を使用すると、問題が修正されました ( MVVMCross Binding Crashes Android Application を参照)。私が今抱えている問題は同じ結果ですが、アダプターの最初のビューが親ビューモデル (アイテムではなく) のプロパティにバインドされています。

バインドに使用されるコードは次のとおりです。

public class SubjectFilterAdapter : MvxAdapter {
    private EntityListFragment<TEntity, TViewModel> _owner;

    public SubjectFilterAdapter(Context context, EntityListFragment<TEntity, TViewModel> owner) : base(context, (IMvxAndroidBindingContext)owner.BindingContext) {

        _owner = owner;
    }

    protected override View GetBindableView(View convertView, object dataContext, int templateId) {
        var view = base.GetBindableView(convertView, dataContext, templateId);

        if (templateId == ItemTemplateId && GetPosition(dataContext) == 0) {
            var set = _owner.CreateBindingSet<EntityListFragment<TEntity, TViewModel>, TViewModel>();

            set.Bind(view.FindViewById<TextView>(Resource.Id.SelectedScheduleText))
                .To(x => x.SelectedScheduleText).WithClearBindingKey("SelectedScheduleTextFilterBinding");

            set.Apply();
        }

        return view;
    }

    protected override void JavaFinalize() {
        if (this.BindingContext != null)
            this.BindingContext.ClearAllBindings();
        base.JavaFinalize();
    }
}

最初は (最初の数回の変更では) 正しく動作しますが、その後、上記の例外がスローされます。MvvmCross を使用します3.0.14-beta3

ありがとう!

4

2 に答える 2

0

上記のアダプタ コードを次のように更新することで修正されました。

    public class SubjectFilterAdapter : MvxAdapter {
        private EntityListFragment<TEntity, TViewModel> _owner;

        private MvxFluentBindingDescriptionSet<EntityListFragment<TEntity, TViewModel>, TViewModel> _scheduleBindingSet; 

        public SubjectFilterAdapter(Context context, EntityListFragment<TEntity, TViewModel> owner)
            : base(context, (IMvxAndroidBindingContext)owner.BindingContext) {

            _owner = owner;
        }

        protected override View GetBindableView(View convertView, object dataContext, int templateId) {
            var view = base.GetBindableView(convertView, dataContext, templateId);

            if (templateId == ItemTemplateId && GetPosition(dataContext) == 0) {
                if (_scheduleBindingSet != null) {
                    _owner.BindingContext.ClearBindings("SelectedScheduleTextFilterBinding");

                    _scheduleBindingSet = null;
                }

                _scheduleBindingSet = _owner.CreateBindingSet<EntityListFragment<TEntity, TViewModel>, TViewModel>();

                _scheduleBindingSet.Bind(view.FindViewById<TextView>(Resource.Id.SelectedScheduleText))
                    .To(x => x.SelectedScheduleText).WithClearBindingKey("SelectedScheduleTextFilterBinding");

                _scheduleBindingSet.Apply();
            }

            return view;
        }

        protected override void JavaFinalize() {
            if (this.BindingContext != null)
                this.BindingContext.ClearAllBindings();
            base.JavaFinalize();
        }
    }
于 2013-11-17T14:15:12.627 に答える