【发布时间】:2013-11-14 09:44:47
【问题描述】:
我正在将 MvvmCross 与 MonoDroid 一起使用。
在视图模型中的计时器中,我每分钟调用一次 RaisePropertyChanged("MinutesRemaining") - MinutesRemaining 是一个整数,指定当前条目结束前的持续时间(是的,这是在 UI 线程上调用的!)。
MinutesRemaining 使用 MvvmCross 绑定到 TextView。
在 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.
谢谢!
【问题讨论】:
-
这个问题是否出现在列表中?还是在其他一些控制?您是否在最新代码中看到了这一点 - 例如3.0.14-beta3 二进制文件? (这不包括该链接问题中的 JavaFinalize,但确实包括列表周围的其他更改)
-
JavaFinalize 修复了其中一个 - 另一个未修复(使用视图模型而不是该项目的数据上下文绑定到适配器内的文本视图)。我已经更新到 beta3 二进制文件,问题仍然存在 :(
标签: android xamarin.android xamarin mvvmcross