Search code examples
data-bindingtouchmvvmcross

MvxImageViewLoader binding not working


I use MvxImageViewLoader in pretty simple situation.

On ViewDidLoad:

        var pnlBackImage = new UIImageView(new RectangleF(0, 0, pnlBack.Frame.Width, pnlBack.Frame.Height));
        Add(pnlBackImage);
        pnlBackImageLoader = new MvxImageViewLoader(() => pnlBackImage);

        ...

        set.Bind(pnlBackImageLoader).To(x => x.UserBackgroundUrl);

where UserBackgroundUrl is a common string property.

But on set.Apply() I see the following in my log and image is not loading:

2013-06-24 13:51:26.999 SPBTouch[446:21b03] MvxBind: Error:   2.78 Problem seen during binding execution for from UserBackgroundUrl to ImageUrl - 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) [0x000d9] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Reflection/MonoMethod.cs:236 
  at System.Reflection.MonoProperty.SetValue (System.Object obj, System.Object value, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] index, System.Globalization.CultureInfo culture) [0x00064] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Reflection/MonoProperty.cs:353 
  at System.Reflection.PropertyInfo.SetValue (System.Object obj, System.Object value, System.Object[] index) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Reflection/PropertyInfo.cs:93 
  at Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.SetValue (System.Object value) [0x00000] in <filename unknown>:0 
  at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource (Boolean isAvailable, System.Object value) [0x00000] in <filename unknown>:0 
InnerException was NullReferenceException: Object reference not set to an instance of an object
      at Cirrious.MvvmCross.Binding.Views.MvxBaseImageViewLoader`1[MonoTouch.UIKit.UIImage].set_ImageUrl (System.String value) [0x00000] in <filename unknown>:0 
  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) [0x000c0] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Reflection/MonoMethod.cs:228 

I've even defined the image loader and even the image panel as the view fields, but there is still no luck. What can cause that problem?

Thank you.


Solution

  • The inner exception error you've listed is:

    NullReferenceException: Object reference not set to an instance of an object at Cirrious.MvvmCross.Binding.Views.MvxBaseImageViewLoader`1[MonoTouch.UIKit.UIImage].set_ImageUrl (System.String value) [0x00000] in :0

    I guess the thing that would cause a NullReferenceException in the set of:

        public string ImageUrl
        {
            get { return _imageHelper.ImageUrl; }
            set { _imageHelper.ImageUrl = value; }
        }
    

    is if _imageHelper is null

    Looking in MvxBaseImageViewLoader.cs#L31 this can happen if this error message is displayed Unable to resolve the image helper - have you referenced and called EnsureLoaded on the DownloadCache plugin?

    Is this error message displayed? If so, is the DownloadCache plugin (and it's dependent plugin File) loaded in your application?


    If this doesn't help, try comparing your app so some of the apps in N+1. Successful use of the image views is covered in several of N+1 videos - http://mvvmcross.wordpress.com/ - e.g. N=2 or N=3