MonoDroid で MvvmCross を使用しています。
ビューモデルのタイマーでは、1分ごとに呼び出しますRaisePropertyChanged("MinutesRemaining")
-MinutesRemaining
現在のエントリが終了するまでの期間を分単位で指定する整数です(はい、これはUIスレッドで呼び出されます!)。
MinutesRemaining
TextView
MvvmCross を使用してバインドされます。
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
。
ありがとう!