Commander.Fody
Commander.Fody copied to clipboard
MVVMCross InvalidProgramException: Missing or incorrect header for method add_CanExecuteChanged
Hi, upon binding commands with MVVMCross, there is a Warning below, could you please have a look?
MvxBind:Error: 0.94 Problem seen during binding execution for binding Click for SubmitCommand - problem TargetInvocationException: Exception has been thrown by the target of an invocation. at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00050] in /Users/builder/data/lanes/2970/46c3f7e0/source/mono/mcs/class/corlib/System.Reflection/MonoMethod.cs:303 at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) [0x00000] in /Users/builder/data/lanes/2970/46c3f7e0/source/mono/external/referencesource/mscorlib/system/reflection/methodbase.cs:277 at MvvmCross.Platform.WeakSubscription.MvxWeakEventSubscription`2[TSource,TEventArgs].AddEventHandler () [0x0002c] in V:\Xamarin\MvvmCross\MvvmCross\Platform\Platform\WeakSubscription\MvxWeakEventSubscription.cs:118
InnerException was InvalidProgramException: Missing or incorrect header for method add_CanExecuteChanged at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&) at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00038] in /Users/builder/data/lanes/2970/46c3f7e0/source/mono/mcs/class/corlib/System.Reflection/MonoMethod.cs:295
I'm hitting this too, without MVVMCross. I really want Commander to work, as I hate command objects, but they are required for MVVM in Xamarin.
[MonoDroid] UNHANDLED EXCEPTION: [MonoDroid] System.InvalidProgramException: Missing or incorrect header for method add_CanExecuteChanged [MonoDroid] at Xamarin.Forms.Button.OnCommandChanged () [0x00008] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Button.cs:212 [MonoDroid] at Xamarin.Forms.Button+<>c.<.cctor>b__72_0 (Xamarin.Forms.BindableObject bo, System.Object o, System.Object n) [0x00000] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Button.cs:12 [MonoDroid] at Xamarin.Forms.BindableObject.SetValueActual (Xamarin.Forms.BindableProperty property, Xamarin.Forms.BindablePropertyContext context, System.Object value, Boolean currentlyApplying, SetValueFlags attributes, Boolean silent) [0x00108] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindableObject.cs:584 [MonoDroid] at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty property, System.Object value, SetValueFlags attributes, SetValuePrivateFlags privateAttributes) [0x0014b] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindableObject.cs:378 [MonoDroid] at Xamarin.Forms.BindingExpression.ApplyCore (System.Object sourceObject, Xamarin.Forms.BindableObject target, Xamarin.Forms.BindableProperty property, Boolean fromTarget) [0x0020c] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindingExpression.cs:177 [MonoDroid] at Xamarin.Forms.BindingExpression.Apply (System.Object sourceObject, Xamarin.Forms.BindableObject target, Xamarin.Forms.BindableProperty property) [0x0006b] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindingExpression.cs:76 [MonoDroid] at Xamarin.Forms.Binding.Apply (System.Object newContext, Xamarin.Forms.BindableObject bindObj, Xamarin.Forms.BindableProperty targetProperty) [0x00042] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Binding.cs:113 [MonoDroid] at Xamarin.Forms.BindableObject.ApplyBindings (System.Object oldContext, Boolean skipBindingContext) [0x00034] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindableObject.cs:408 [MonoDroid] at Xamarin.Forms.BindableObject.ApplyBindings (System.Object oldContext) [0x00000] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindableObject.cs:123 [MonoDroid] at Xamarin.Forms.BindableObject.SetInheritedBindingContext (Xamarin.Forms.BindableObject bindable, System.Object value) [0x0005a] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindableObject.cs:117 [MonoDroid] at Xamarin.Forms.Element.SetChildInheritedBindingContext (Xamarin.Forms.Element child, System.Object context) [0x00000] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Element.cs:473 [MonoDroid] at Xamarin.Forms.Element.OnBindingContextChanged () [0x00021] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Element.cs:323 [MonoDroid] at Xamarin.Forms.View.OnBindingContextChanged () [0x00042] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\View.cs:98 [MonoDroid] at Xamarin.Forms.Grid.OnBindingContextChanged () [0x00006] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Grid.cs:138 [MonoDroid] at Xamarin.Forms.BindableObject.SetInheritedBindingContext (Xamarin.Forms.BindableObject bindable, System.Object value) [0x00061] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindableObject.cs:118 [MonoDroid] at Xamarin.Forms.Element.SetChildInheritedBindingContext (Xamarin.Forms.Element child, System.Object context) [0x00000] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Element.cs:473 [MonoDroid] at Xamarin.Forms.Element.OnBindingContextChanged () [0x00021] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Element.cs:323 [MonoDroid] at Xamarin.Forms.View.OnBindingContextChanged () [0x00042] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\View.cs:98 [MonoDroid] at Xamarin.Forms.BindableObject.SetInheritedBindingContext (Xamarin.Forms.BindableObject bindable, System.Object value) [0x00061] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindableObject.cs:118 [MonoDroid] at Xamarin.Forms.Element.SetChildInheritedBindingContext (Xamarin.Forms.Element child, System.Object context) [0x00000] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Element.cs:473 [MonoDroid] at Xamarin.Forms.Element.OnBindingContextChanged () [0x00021] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Element.cs:323 [MonoDroid] at Xamarin.Forms.View.OnBindingContextChanged () [0x00042] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\View.cs:98 [MonoDroid] at Xamarin.Forms.BindableObject.SetInheritedBindingContext (Xamarin.Forms.BindableObject bindable, System.Object value) [0x00061] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindableObject.cs:118 [MonoDroid] at Xamarin.Forms.Element.SetChildInheritedBindingContext (Xamarin.Forms.Element child, System.Object context) [0x00000] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Element.cs:473 [MonoDroid] at Xamarin.Forms.Element.OnBindingContextChanged () [0x00021] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Element.cs:323 [MonoDroid] at Xamarin.Forms.View.OnBindingContextChanged () [0x00042] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\View.cs:98 [MonoDroid] at Xamarin.Forms.Grid.OnBindingContextChanged () [0x00006] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Grid.cs:138 [MonoDroid] at Xamarin.Forms.BindableObject.SetInheritedBindingContext (Xamarin.Forms.BindableObject bindable, System.Object value) [0x00061] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindableObject.cs:118 [MonoDroid] at Xamarin.Forms.Element.SetChildInheritedBindingContext (Xamarin.Forms.Element child, System.Object context) [0x00000] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Element.cs:473 [MonoDroid] at Xamarin.Forms.TemplatedPage.SetChildInheritedBindingContext (Xamarin.Forms.Element child, System.Object context) [0x00008] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\TemplatedPage.cs:35 [MonoDroid] at Xamarin.Forms.Element.OnBindingContextChanged () [0x00021] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Element.cs:323 [MonoDroid] at Xamarin.Forms.Page.OnBindingContextChanged () [0x00000] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\Page.cs:203 [MonoDroid] at Xamarin.Forms.ContentPage.OnBindingContextChanged () [0x00000] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\ContentPage.cs:16 [MonoDroid] at FreshMvvm.FreshBaseContentPage.OnBindingContextChanged () [0x00000] in /Users/michaelridland/Projects/FreshMvvm/src/FreshMvvm/FreshBaseContentPage.cs:15 [MonoDroid] at FreeXam.Forms.SelfContextFreshPage.OnBindingContextChanged () [0x00044] in /Users/gary/repos/freewheeler/FreeXam/FreeXam.Forms/Pages/SelfContextFreshPage.cs:29 [MonoDroid] at Xamarin.Forms.BindableObject.BindingContextPropertyBindingPropertyChanged (Xamarin.Forms.BindableObject bindable, System.Object oldvalue, System.Object newvalue) [0x0001b] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindableObject.cs:429 [MonoDroid] at Xamarin.Forms.BindableObject.SetValueActual (Xamarin.Forms.BindableProperty property, Xamarin.Forms.BindablePropertyContext context, System.Object value, Boolean currentlyApplying, SetValueFlags attributes, Boolean silent) [0x00108] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindableObject.cs:584 [MonoDroid] at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty property, System.Object value, SetValueFlags attributes, SetValuePrivateFlags privateAttributes) [0x00171] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindableObject.cs:386 [MonoDroid] at Xamarin.Forms.BindableObject.SetValue (Xamarin.Forms.BindableProperty property, System.Object value, Boolean fromStyle, Boolean checkAccess) [0x0005f] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindableObject.cs:531 [MonoDroid] at Xamarin.Forms.BindableObject.SetValue (Xamarin.Forms.BindableProperty property, System.Object value) [0x00000] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindableObject.cs:83 [MonoDroid] at Xamarin.Forms.BindableObject.set_BindingContext (System.Object value) [0x00000] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Core\BindableObject.cs:24 [MonoDroid] at FreshMvvm.FreshPageModelResolver.BindingPageModel (System.Object data, Xamarin.Forms.Page targetPage, FreshMvvm.FreshBasePageModel pageModel) [0x00022] in /Users/michaelridland/Projects/FreshMvvm/src/FreshMvvm/FreshPageModelResolver.cs:54 [MonoDroid] at FreshMvvm.FreshPageModelResolver.ResolvePageModel (System.Type type, System.Object data, FreshMvvm.FreshBasePageModel pageModel) [0x0003b] in /Users/michaelridland/Projects/FreshMvvm/src/FreshMvvm/FreshPageModelResolver.cs:43 [MonoDroid] at FreshMvvm.FreshPageModelResolver.ResolvePageModel[T](System.Object data, FreshMvvm.T pageModel) [0x0000e] in /Users/michaelridland/Projects/FreshMvvm/src/FreshMvvm/FreshPageModelResolver.cs:25 [MonoDroid] at FreshMvvm.PageModelCoreMethods+<PushPageModel>c__async5.MoveNext () [0x00021] in /Users/michaelridland/Projects/FreshMvvm/src/FreshMvvm/PageModelCoreMethods.cs:68 [MonoDroid] --- End of stack trace from previous location where exception was thrown --- [MonoDroid] at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 [MonoDroid] at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 [MonoDroid] at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 [MonoDroid] at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 [MonoDroid] at System.Runtime.CompilerServices.TaskAwaiter.GetResult () [0x00000] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:113 [MonoDroid] at FreshMvvm.PageModelCoreMethods+<PushPageModel>c__async3`1[T].MoveNext () [0x00031] in /Users/michaelridland/Projects/FreshMvvm/src/FreshMvvm/PageModelCoreMethods.cs:43 [MonoDroid] --- End of stack trace from previous location where exception was thrown --- [MonoDroid] at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 [MonoDroid] at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 [MonoDroid] at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 [MonoDroid] at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 [MonoDroid] at System.Runtime.CompilerServices.TaskAwaiter.GetResult () [0x00000] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:113 [MonoDroid] at FreeXam.Forms.PartnerRewardsView+<OnRewardItemClicked>c__async0.MoveNext () [0x0008f] in /Users/gary/repos/freewheeler/FreeXam/FreeXam.Forms/Views/PartnerRewardsView.xaml.cs:30 [MonoDroid] --- End of stack trace from previous location where exception was thrown --- [MonoDroid] at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 [MonoDroid] at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>m__0 (System.Object state) [0x00000] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1018 [MonoDroid] at Android.App.SyncContext+<Post>c__AnonStorey0.<>m__0 () [0x00000] in /Users/builder/data/lanes/3415/7db2aac3/source/monodroid/src/Mono.Android/src/Android.App/SyncContext.cs:18 [MonoDroid] at Java.Lang.Thread+RunnableImplementor.Run () [0x0000b] in /Users/builder/data/lanes/3415/7db2aac3/source/monodroid/src/Mono.Android/src/Java.Lang/Thread.cs:36 [MonoDroid] at Java.Lang.IRunnableInvoker.n_Run (IntPtr jnienv, IntPtr native__this) [0x00009] in /Users/builder/data/lanes/3415/7db2aac3/source/monodroid/src/Mono.Android/platforms/android-23/src/generated/Java.Lang.IRunnable.cs:81 [MonoDroid] at (wrapper dynamic-method) System.Object:0cc30f9c-df7f-48a0-bb6a-20e0768c4710 (intptr,intptr)
I'm hoping to brush the dust off this repo really soon. I have done ZERO Xamarin work so this will be interesting.
Thanks for any assistance - Xamarin is totally worth the effort if mobile dev is important to you.
I really think this is an important piece of the puzzle for making Xamarin MVVM sing. While older MVVM frameworks have alternative shortcuts, FreshMVVM is pretty nice but doesn't.
I tweeted this https://twitter.com/gazmcghee/status/706276600027852800
Related: not sure if this is a Xamarin bug, or something that Commander could adapt to support:
https://forums.xamarin.com/discussion/42525/icommand-canexecute-not-called
Summary: Xamarin's impl of Command doesn't spam CanExecute internally, it relies on the viewmodel code to call RaiseCanExecuteChanged() on demand. I don't see a way to do this in the current impl of Commander.
Would an additional attribute like [Commander.OnCommandCanExecuteChanged("CmdName")]
be a possibility to add to enable this? Thinking as I type... this might not work. Not sure how to get a ref to the Command/DelegateCommand created by Commander in user code...