In previous posts, I talked about the misfortunes of the Xamarin.Forms TableView
. In this post, we will look at changing the separator color with a custom renderer.
For some other Xamarin.Tips on upgrading your TableView
, check out these two posts on customizing the Section Titles!
Android: Xamarin.Tips – Xamarin.Forms Android Custom TableView Section Titles
iOS: Xamarin.Tips – Xamarin.Forms iOS Custom TableView Section Titles
Let’s get started with a custom view that inherits the TableView
and adds a BindableProperty
for our SeparatorColor
:
ColoredTableView.cs
public partial class ColoredTableView : TableView { public static BindableProperty SeparatorColorProperty = BindableProperty.Create("SeparatorColor", typeof(Color), typeof(ColoredTableView), Color.White); public Color SeparatorColor { get { return (Color)GetValue(SeparatorColorProperty); } set { SetValue(SeparatorColorProperty, value); } } public ColoredTableView() { InitializeComponent(); } }
Now let’s take this view and create our renderers!
Let’s start with Android:
ColoredTableViewRenderer.cs
[assembly: ExportRenderer(typeof(ColoredTableView), typeof(ColoredTableViewRenderer))] namespace YOUR_ANDROID_NAMESPACE { public class ColoredTableViewRenderer : TableViewRenderer { protected override void OnElementChanged(ElementChangedEventArgs<TableView> e) { base.OnElementChanged(e); if (Control == null) return; var listView = Control as Android.Widget.ListView; var coloredTableView = (ColoredTableView)Element; listView.Divider = new ColorDrawable(coloredTableView.SeparatorColor.ToAndroid()); listView.DividerHeight = 3; } protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { base.OnElementPropertyChanged(sender, e); if(e.PropertyName == "SeparatorColor") { var listView = Control as Android.Widget.ListView; var coloredTableView = (ColoredTableView)Element; listView.Divider = new ColorDrawable(coloredTableView.SeparatorColor.ToAndroid()); } } } }
Basically, we take the color and apply it as a ColorDrawable
, including updating when the property changes from our Forms code.
Now let’s write up our iOS renderer:
ColoredTableViewRenderer.cs
[assembly: ExportRenderer(typeof(ColoredTableView), typeof(ColoredTableViewRenderer))] namespace YOUR_IOS_NAMESPACE { public class ColoredTableViewRenderer : TableViewRenderer { protected override void OnElementChanged(ElementChangedEventArgs<TableView> e) { base.OnElementChanged(e); if (Control == null) return; var tableView = Control as UITableView; var coloredTableView = Element as ColoredTableView; tableView.SeparatorColor = coloredTableView.SeparatorColor.ToUIColor(); } protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { base.OnElementPropertyChanged(sender, e); if(e.PropertyName == "SeparatorColor") { var tableView = Control as UITableView; var coloredTableView = Element as ColoredTableView; tableView.SeparatorColor = coloredTableView.SeparatorColor.ToUIColor(); } } } }
Similarly to our Android implementation, we set the SeparatorColor
of our Native UITableView
on set up and when the value changes.
If you like what you see, don’t forget to follow me on twitter @Suave_Pirate, check out my GitHub, and subscribe to my blog to learn more mobile developer tips and tricks!