Force redraw of Xamarin.Forms View with custom renderer
First, turn you BoundaryColor
into a bindable property. That's not required, firing INPC
event is enough, but then you can bind to it:
public static readonly BindableProperty BoundaryColorProperty = BindableProperty.Create ("BoundaryColor", typeof(Color), typeof(MyButton), Color.Default);public Color BoundaryColor { get { return (Color)GetValue (BoudaryColorProperty); } set { SetValue (BoundaryColorProperty, value); }}
then, in your renderer:
protected override void OnElementPropertyChanged (object sender, PropertyChangedEventArgs e){ base.OnElementPropertyChanged (sender, e); if (e.PropertyName == MyButton.BoundaryColorProperty.PropertyName) SetNeedsDisplay ();}
Two modifications were required:
Call
OnPropertyChanged
within the setter of theBoundaryColor
property:public class MyButton: Button{ Color boundaryColor = Color.Red; public Color BoundaryColor { get { return boundaryColor; } set { boundaryColor = value; OnPropertyChanged(); // <-- here } }}
Subscribe to the event within the
OnElementChanged
method ofMyButtonRenderer
:public class MyButtonRenderer: ButtonRenderer{ protected override void OnElementChanged(ElementChangedEventArgs<Button> e) { base.OnElementChanged(e); Element.PropertyChanged += (s_, e_) => SetNeedsDisplay(); // <-- here } public override void Draw(RectangleF rect) { // ... }}
Note:It seems to be important to subscribe within OnElementChanged
and not the constructor. Otherwise a System.Reflection.TargetInvocationException
is raised.