Here’s another super simple tip that has made my life easier with a basic control for iOS – the BindableRefreshControl. The premise is to wrap the BeginRefreshing() and EndRefreshing() calls into a bindable property that can be applied with a one-way binding from a ViewModel.
To premise this a bit, the existing UIRefreshControl from iOS has the two methods mentioned above as well as a Refreshing bool property that is readonly. The need for wrapping this in a property came from wanting to bind my native ViewControllers to a ViewModel and a property such as IsLoading.
So here’s the control:
BindableRefreshControl.cs
/// <summary>
/// Bindable refresh control.
/// Adds a refresh event to bind to.
/// </summary>
public class BindableRefreshControl : UIRefreshControl
{
private bool _isRefreshing;
public bool IsRefreshing
{
get
{
return _isRefreshing;
}
set
{
_isRefreshing = value;
if (value)
BeginRefreshing();
else
EndRefreshing();
}
}
}
Yeah that’s literally it.
However, I now can use it like this (using MvvmLight):
MainViewModel.cs
public class MainViewModel : ViewModelBase
{
private bool _isLoading;
public bool IsLoading
{
get
{
return _isLoading;
}
set
{
Set(ref _isLoading, value);
}
}
}
And in the ViewController:
MainViewController.cs
public class MainViewController : UIViewController
{
private BindableRefreshControl _refreshControl;
private MainViewModel _viewModel;
protected override void ViewDidLoad()
{
_viewModel = new MainViewModel();
_refreshControl = new BindableRefreshControl();
...
...
this.SetBinding(() => _viewModel.IsLoading,
() => _refreshControl.IsRefreshing));
}
}
And like that, your native iOS spinners can be easily bound to your view model properties!
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!
Interested in sponsoring developer content? Message @Suave_Pirate on twitter for details.
One thought on “Xamarin.Tip – Bindable iOS UIRefreshControl”