在MvvmCross中使用MvxGridView

我想要做的是在网格中显示多个项目的简单屏幕。 这可以在Android上使用GridView轻松存档。

在MvvmCross中我想我必须使用MvxGridView来存档相同的内容。

这是我的方法:

    

itemview:

     

我的ViewModel:

 using System.Collections.ObjectModel; using Cirrious.MvvmCross.ViewModels; namespace GridViewBug.Core.ViewModels { public class FirstViewModel : MvxViewModel { public FirstViewModel() { Items = new ObservableCollection(); Items.Add(new TestClass { Name = "Test1" }); Items.Add(new TestClass { Name = "Test2" }); } private string _hello = "Hello MvvmCross"; public string Hello { get { return _hello; } set { _hello = value; RaisePropertyChanged(() => Hello); } } public ObservableCollection Items { get; set; } } public class TestClass { public string Name { get; set; } } } 

在这里运行这个例子时会发生什么:

 05-03 16:18:32.799 I/MvxBind ( 7960): 0.84 Problem seen during binding execution for from Items to ItemsSource - problem TargetInvocationException: Exception has been thrown by the target of an invocation. 05-03 16:18:32.799 I/MvxBind ( 7960): at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in :0 05-03 16:18:32.799 I/MvxBind ( 7960): at System.Reflection.MonoProperty.SetValue (System.Object obj, System.Object value, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] index, System.Globalization.CultureInfo culture) [0x00000] in :0 05-03 16:18:32.799 I/MvxBind ( 7960): at System.Reflection.PropertyInfo.SetValue (System.Object obj, System.Object value, System.Object[] index) [0x00000] in :0 05-03 16:18:32.799 I/MvxBind ( 7960): at Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.SetValue (System.Object value) [0x00000] in :0 05-03 16:18:32.799 I/MvxBind ( 7960): at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource (Boolean isAvailable, System.Object value) [0x00000] in :0 05-03 16:18:32.799 I/MvxBind ( 7960): InnerException was UnsupportedOperationException: Exception of type 'Java.Lang.UnsupportedOperationException' was thrown. 05-03 16:18:32.799 I/MvxBind ( 7960): at Android.Runtime.JNIEnv.CallNonvirtualVoidMethod (IntPtr jobject, IntPtr jclass, IntPtr jmethod) [0x00023] in /Users/builder/data/lanes/monodroid-lion-bs1/03814ac5/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:604 05-03 16:18:32.799 I/MvxBind ( 7960): at Android.Views.ViewGroup.RemoveAllViews () [0x00053] in /Users/builder/data/lanes/monodroid-lion-bs1/03814ac5/source/monodroid/src/Mono.Android/platforms/android-8/src/generated/Android.Views.ViewGroup.cs:2582 05-03 16:18:32.799 I/MvxBind ( 7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxViewGroupExtensions.Refill (Android.Views.ViewGroup viewGroup, IAdapter adapter) [0x00000] in :0 05-03 16:18:32.799 I/MvxBind ( 7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxViewGroupExtensions.UpdateDataSetFromChange[MvxGridView] (Cirrious.MvvmCross.Binding.Droid.Views.MvxGridView viewGroup, System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs eventArgs) [0x00000] in :0 05-03 16:18:32.799 I/MvxBind ( 7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxGridView.AdapterOnDataSetChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs eventArgs) [0x00000] in :0 05-03 16:18:32.799 I/MvxBind ( 7960): at (wrapper delegate-invoke) :invoke_void__this___object_NotifyCollectionChangedEventArgs (object,System.Collections.Specialized.NotifyCollectionChangedEventArgs) 05-03 16:18:32.799 I/MvxBind ( 7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapterWithChangedEvent.NotifyDataSetChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e) [0x00000] in :0 05-03 16:18:32.799 I/MvxBind ( 7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapterWithChangedEvent.NotifyDataSetChanged () [0x00000] in :0 05-03 16:18:32.799 I/MvxBind ( 7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapter.SetItemsSource (IEnumerable value) [0x00000] in :0 05-03 16:18:32.799 I/MvxBind ( 7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapter.set_ItemsSource (IEnumerable value) [0x00000] in :0 05-03 16:18:32.799 I/MvxBind ( 7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxGridView.set_ItemsSource (IEnumerable value) [0x00000] in :0 05-03 16:18:32.799 I/MvxBind ( 7960): at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&) 05-03 16:18:32.799 I/MvxBind ( 7960): at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in :0 05-03 16:18:32.799 I/MvxBind ( 7960): --- End of managed exception stack trace --- 05-03 16:18:32.799 I/MvxBind ( 7960): java.lang.UnsupportedOperationException: removeAllViews() is not supported in AdapterView 05-03 16:18:32.799 I/MvxBind ( 7960): at android.widget.AdapterView.removeAllViews(AdapterView.java:521) 05-03 16:18:32.799 I/MvxBind ( 7960): at cirrious.mvvmcross.binding.droid.binders.MvxBindingLayoutInflatorFactory.n_onCreateView(Native Method) 05-03 16:18:32.799 I/MvxBind ( 7960): at cirrious.mvvmcross.binding.droid.binders.MvxBindingLayoutInflatorFactory.onCreateView(MvxBindingLayoutInflatorFactory.java:29) 05-03 16:18:32.799 I/MvxBind ( 7960): at android.view.LayoutInflater.createViewFromTag(Layo 05-03 16:18:32.799 I/mono-stdout( 7960): MvxBind:Error: 0.84 Problem seen during binding execution for from Items to ItemsSource - problem TargetInvocationException: Exception has been thrown by the target of an invocation. 05-03 16:18:32.799 I/mono-stdout( 7960): at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in :0 05-03 16:18:32.799 I/mono-stdout( 7960): at System.Reflection.MonoProperty.SetValue (System.Object obj, System.Object value, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] index, System.Globalization.CultureInfo culture) [0x00000] in :0 05-03 16:18:32.799 I/mono-stdout( 7960): at System.Reflection.PropertyInfo.SetValue (System.Object obj, System.Object value, System.Object[] index) [0x00000] in :0 05-03 16:18:32.799 I/mono-stdout( 7960): at Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.SetValue (System.Object value) [0x00000] in :0 05-03 16:18:32.809 I/mono-stdout( 7960): at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource (Boolean isAvailable, System.Object value) [0x00000] in :0 05-03 16:18:32.809 I/mono-stdout( 7960): InnerException was UnsupportedOperationException: Exception of type 'Java.Lang.UnsupportedOperationException' was thrown. 05-03 16:18:32.809 I/mono-stdout( 7960): at Android.Runtime.JNIEnv.CallNonvirtualVoidMethod (IntPtr jobject, IntPtr jclass, IntPtr jmethod) [0x00023] in /Users/builder/data/lanes/monodroid-lion-bs1/03814ac5/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:604 05-03 16:18:32.809 I/mono-stdout( 7960): at Android.Views.ViewGroup.RemoveAllViews () [0x00053] in /Users/builder/data/lanes/monodroid-lion-bs1/03814ac5/source/monodroid/src/Mono.Android/platforms/android-8/src/generated/Android.Views.ViewGroup.cs:2582 05-03 16:18:32.809 I/mono-stdout( 7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxViewGroupExtensions.Refill (Android.Views.ViewGroup viewGroup, IAdapter adapter) [0x00000] in :0 05-03 16:18:32.809 I/mono-stdout( 7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxViewGroupExtensions.UpdateDataSetFromChange[MvxGridView] (Cirrious.MvvmCross.Binding.Droid.Views.MvxGridView viewGroup, System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs eventArgs) [0x00000] in :0 05-03 16:18:32.809 I/mono-stdout( 7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxGridView.AdapterOnDataSetChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs eventArgs) [0x00000] in :0 05-03 16:18:32.809 I/mono-stdout( 7960): at (wrapper delegate-invoke) :invoke_void__this___object_NotifyCollectionChangedEventArgs (object,System.Collections.Specialized.NotifyCollectionChangedEventArgs) 05-03 16:18:32.809 I/mono-stdout( 7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapterWithChangedEvent.NotifyDataSetChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e) [0x00000] in :0 05-03 16:18:32.809 I/mono-stdout( 7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapterWithChangedEvent.NotifyDataSetChanged () [0x00000] in :0 05-03 16:18:32.809 I/mono-stdout( 7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapter.SetItemsSource (IEnumerable value) [0x00000] in :0 05-03 16:18:32.809 I/mono-stdout( 7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxAdapter.set_ItemsSource (IEnumerable value) [0x00000] in :0 05-03 16:18:32.809 I/mono-stdout( 7960): at Cirrious.MvvmCross.Binding.Droid.Views.MvxGridView.set_ItemsSource (IEnumerable value) [0x00000] in :0 05-03 16:18:32.809 I/mono-stdout( 7960): at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&) 05-03 16:18:32.809 I/mono-stdout( 7960): at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in :0 05-03 16:18:32.809 I/mono-stdout( 7960): --- End of managed exception stack trace --- 05-03 16:18:32.809 I/mono-stdout( 7960): java.lang.UnsupportedOperationException: removeAllViews() is not supported in AdapterView 05-03 16:18:32.809 I/mono-stdout( 7960): at android.widget.AdapterView.removeAllViews(AdapterView.java:521) 05-03 16:18:32.809 I/mono-stdout( 7960): at cirrious.mvvmcross.binding.droid.binders.MvxBindingLayoutInflatorFactory.n_onCreateView(Native Method) 05-03 16:18:32.809 I/mono-stdout( 7960): at cirrious.mvvmcross.binding.droid.binders.MvxBindingLayoutInflatorFactory.onCreateView(MvxBindingLayoutInflatorFactory.java:29) 05-03 16:18:32.809 I/mono-stdout( 7960): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669) 05-03 16:18:32.809 I/mono-stdout( 7960): at android.view.LayoutInflater.rInflate(LayoutInflater.java:739) 05-03 16:18:32.809 I/mono-stdout( 7960): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 05-03 16:18:32.809 I/mono-stdout( 7960): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 05-03 16:18:32.809 I/mono-stdout( 7960): at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 05-03 16:18:32.809 I/mono-stdout( 7960): at gridviewbug.droid.views.FirstView.n_onCreate(Native Method) 05-03 16:18:32.809 I/mono-stdout( 7960): at gridviewbug.droid.views.FirstView.onCreate(FirstView.java:28) 05-03 16:18:32.809 I/mono-stdout( 7960): at android.app.Activity.performCreate(Activity.java:4465) 05-03 16:18:32.809 I/mono-stdout( 7960): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 05-03 16:18:32.809 I/mono-stdout( 7960): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 05-03 16:18:32.809 I/mono-stdout( 7960): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 05-03 16:18:32.809 I/mono-stdout( 7960): at android.app.ActivityThread.access$600(ActivityThread.java:123) 05-03 16:18:32.809 I/mono-stdout( 7960): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 05-03 16:18:32.809 I/mono-stdout( 7960): at android.os.Handler.dispatchMessage(Handler.java:99) 05-03 16:18:32.809 I/mono-stdout( 7960): at android.os.Looper.loop(Looper.java:137) 05-03 16:18:32.809 I/mono-stdout( 7960): at android.app.ActivityThread.main(ActivityThread.java:4424) 05-03 16:18:32.809 I/mono-stdout( 7960): at java.lang.reflect.Method.invokeNative(Native Method) 05-03 16:18:32.809 I/mono-stdout( 7960): at java.lang.reflect.Method.invoke(Method.java:511) 05-03 16:18:32.809 I/mono-stdout( 7960): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 05-03 16:18:32.809 I/mono-stdout( 7960): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 05-03 16:18:32.809 I/mono-stdout( 7960): at dalvik.system.NativeStart.main(Native Method) 

我做错了什么? 我正在使用Nuget最新的东西。 在VS2012中运行Mono Android 4.6.4

这是包含完整代码的repo: https : //github.com/sschoeb/MvvmCrossGridViewProblem

从tracem看起来它看起来像一个直接的bug,可能是修复另一个问题时出现的回归。

你最好的选择是在GitHub上打开一个问题 – https://github.com/slodge/MvvmCross/issues/new ? 或者您可以分叉源并将其修复到您的分支中。


在此期间,也许尝试使用MvxListView? 或者创建一个新的可绑定ViewGroup?