Search code examples
mvvmcross

Detect when bind occurs in mvvmcross


Hi i need to intercept when bind occur in mvvmcross project.

I have my MvxCollectionViewCell that i bind:

public ProjectsCollectionCell (IntPtr handle) 
    : base (string.Empty, handle)
{
    this.DelayBind(() => {

        var set = this.CreateBindingSet<ProjectsCollectionCell, ViewItem>();
        set.Bind (lblTitle).To (prj => prj.MnemonicId);
        set.Bind (lblDescription).To (prj => prj.Description);
        set.Bind(imgPhoto).For (s => s.Image).WithConversion("ImageArray").To(prj => prj.Image);
        set.Apply();

        if (imgPhoto.Image != null) {
            this.imgPhoto.Layer.RasterizationScale = UIScreen.MainScreen.Scale;
            this.imgPhoto.Layer.ShouldRasterize = true;
            this.imgPhoto.Layer.BorderWidth = 10;
            this.imgPhoto.Layer.BorderColor = UIColor.White.CGColor;
            this.imgPhoto.Layer.CornerRadius = 8f;
            this.imgPhoto.Layer.MasksToBounds = true;
            this.imgPhoto.Layer.Position = new PointF(imgPhoto.Frame.Left - 80, imgPhoto.Frame.Bottom);
            this.imgPhoto.Transform = CGAffineTransform.MakeRotation(-0.05f);
        };
    });
}

i want to intercept when the content of the 'imgPhoto' change.

Is there an event to subscribe?

Could you suggest me how to do this?


Solution

  • If you need to detect when the Image on your cell's DataContext changes, then one way to do this is to add the property to your cell and to bind that property to your DataContext - e.g.

      private byte[] _bytes;
      public byte[] Bytes
      {
          get { return _bytes; }
          set
          {
              _bytes = value;
              // your code here...
          }
      }
    
      public ProjectsCollectionCell (IntPtr handle) 
           : base (string.Empty, handle)
      {
    
           this.DelayBind(() => {
    
                 var set = this.CreateBindingSet<ProjectsCollectionCell, ViewItem>();
                 set.Bind(_hook).For(h => h.CurrentSource);
                 set.Bind (lblTitle).To (prj => prj.MnemonicId);
                 set.Bind (lblDescription).To (prj => prj.Description);
                 set.Bind(this).For(s => s.Bytes).WithConversion("ImageArray").To(prj => prj.Image);
                 set.Apply();
    
                 // etc
             });
      }
    

    As an alternative, you might also want to consider subclassing whatever type imgPhoto is and providing a new property on that object. For an example of this approach, see the AnimatingText properties in http://slodge.blogspot.co.uk/2013/07/n33-animating-data-bound-text-changes.html