I have a visual element MyButton
with a custom renderer implemented for iOS.
Shared:
namespace RendererTest
{
public class MyButton: But
Two modifications were required:
Call OnPropertyChanged
within the setter of the BoundaryColor
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 of MyButtonRenderer
:
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.
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 ();
}