New to xamarin MvvmCross and struggling with some issues. Appreciate for any help.
My questions relates to:
I. My iOS app not being able access and render a drop-down list of Recipients (AllRecipients) that I have in my database from the Core project.
On my SendView, I can render a list of items from hard coded repositories that I have, like Country, City, Service that the user can select from. But unfortunately I cannot render the list of AllRecipients which are dynamically created.
My Droid project doesn't have those issues. I can render a list of items from both hard coded repositories that I have, like Country, City, Service as well as from the dynamically created data(i.e AllRecipients) and that the user can select from for further action (say send money). I am using a SQLite-net extension.
This is the screenshot for AllRecipients that is not rendering
This also a screenshot for other hard coded items its rendering from a different repository.
SendViewModel
public Recipient SelectedRecipient { get { return _selectedRecipient; } set { if (_selectedRecipient != value) { _selectedRecipient = value; RaisePropertyChanged(() => SelectedRecipient); } } } public Service SelectedService { get { return _selectedService; } set { if (_selectedService != value) { _selectedService = value; RaisePropertyChanged(() => SelectedService); } } } public Country SelectedCountry { get { return _selectedCountry; } set { if (_selectedCountry != value) { _selectedCountry = value; RaisePropertyChanged(() => SelectedCountry); } } } public City SelectedCity { get { return _selectedCity; } set { if (_selectedCity != value) { _selectedCity = value; RaisePropertyChanged(() => SelectedCity); } } } public string SendContentTitle { get { return _sendContentTitle; } set { _sendContentTitle = value; RaisePropertyChanged(() => SendContentTitle); } } public string SendContentBody { get { return _sendContentBody; } set { _sendContentBody = value; RaisePropertyChanged(() => SendContentBody); } } public ObservableCollection<Beneficiary> Beneficiaries { get { return _beneficiaries; } set { _beneficiaries = value; RaisePropertyChanged(() => Beneficiaries); } } public ObservableCollection<Service> Services { get { return _services; } set { _services = value; RaisePropertyChanged(() => Services); } } public ObservableCollection<Country> Countries { get { return _countries; } set { _countries = value; RaisePropertyChanged(() => Countries); } } public ObservableCollection<City> Cities { get { return _cities; } set { _cities = value; RaisePropertyChanged(() => Cities); } } public ObservableCollection<string> PossibleTimes { get { return _possibleTimes; } set { _possibleTimes = value; RaisePropertyChanged(() => PossibleTimes); } } public DateTime SelectedDate { get { return _selectedDate; } set { _selectedDate = value; RaisePropertyChanged(() => SelectedDate); } } public object RecipientName { get; private set; } public string CountryName { get; private set; } public string CityName { get; private set; } public string ServiceName { get; private set; } Send _send; public IMvxCommand SaveSend { get { return new MvxCommand(() => { _send.RecipientId = SelectedRecipient.RecipientId; _send.CountryId = SelectedCountry.CountryId; _send.CityId = SelectedCity.CityId; _send.ServiceId = SelectedService.ServiceId; _send.RecipientName = SelectedRecipient.RecipientName; _send.CountryName = SelectedCountry.CountryName; _send.CityName = SelectedCity.CityName; _send.ServiceName = SelectedService.ServiceName; Mvx.Resolve<SendRepository>().CreateSend(_send).Wait(); Close(this); }); } } public IMvxCommand SendCommand { get { return new MvxCommand(() => ShowViewModel<SearchResultViewModel>(new SendParameters { RecipientId = SelectedRecipient.RecipientId, CountryId = SelectedCountry.CountryId, CityId = SelectedCity.CityId, ServiceId = SelectedService.ServiceId, //RemittanceDate = SelectedDate })); } } public SendViewModel(IMvxMessenger messenger, IBeneficiaryDataService beneficiaryDataService, ICountryDataService countryDatasService, IServiceDataService serviceDatasService, ICityDataService cityDataService, IConnectionService connectionService, IDialogService dialogService) : base(messenger) { _beneficiaryDataService = beneficiaryDataService; _countryDataService = countryDatasService; _serviceDataService = serviceDatasService; _cityDataService = cityDataService; _connectionService = connectio`enter code here`nService; _dialogService = dialogService; } public override async void Start() { base.Start(); await ReloadDataAsync(); } protected override async Task InitializeAsync() { await base.InitializeAsync(); if (_connectionService.CheckOnline()) { await LoadCities(); await LoadCountries(); await LoadServices(); } else { await _dialogService.ShowAlertAsync("No internet available",); } } internal async Task LoadCities() { Cities = (await_cityDataService.GetAllCities()) .ToObservableCollection(); } internal async Task LoadCountries() { Countries = (await _countryDataService.GetAllCountries()) .ToObservableCollection(); } internal async Task LoadServices() { Services = (await _serviceDataService.GetAllServices()) .ToObservableCollection(); } public ICommand NavBack { get { return new MvxCommand(() => Close(this)); } } public void Init() { } public void Init(Send send = null) { Task<List<Recipient>> result = Mvx.Resolve<RecipientRepository>().GetAllRecipients(); result.Wait(); AllRecipients = result.Result; string sendContentTitle = Mvx.Resolve<RecipientRepository>().GetSendContentTitle().ToString(); string sendContentBody = Mvx.Resolve<RecipientRepository>().GetSendContentBody().ToString(); SendContentTitle = sendContentTitle; SendContentBody = sendContentBody; _send = send == null ? new Send() : send; RaiseAllPropertiesChanged(); }
SendView
private UIPickerView _recipientTextPicker; private UIPickerView _countryTextPicker; private UIPickerView _cityTextPicker; private UIPickerView _serviceTextPicker; private const int TextFieldMargin = 10; public static readonly int ArrowWidth = 14; protected SendViewModel SendViewModel => ViewModel as SendViewModel; public SendView(IntPtr handle) : base(handle) { } protected override void CreateBindings() { base.CreateBindings(); var set = this.CreateBindingSet<SendView, SendViewModel>(); set.Bind(sendButton).To(vm => vm.SaveSend); CreateRecipientBinding(set); CreateCountryBinding(set); CreateCityBinding(set); CreateServiceBinding(set); set.Apply(); UpdateUi(); AddPickerToTextField(recipientTextField, _recipientTextPicker); AddPickerToTextField(countryTextField, _countryTextPicker); AddPickerToTextField(cityTextField, _cityTextPicker); AddPickerToTextField(serviceTextField, _serviceTextPicker); } private void AddPickerToTextField(UITextField textField, UIPickerView pickerView) { textField.TintColor = UIColor.Clear; var leftPaddingView = new UIView( new CGRect(0, 0, TextFieldMargin, textField.Frame.Height)); textField.LeftView = leftPaddingView; textField.LeftViewMode = UITextFieldViewMode.Always; var arrowImageView = new UIImageView(new CGRect(0, 0, ArrowWidth + TextFieldMargin, textField.Frame.Height)) { Image = UIImage.FromBundle("arrow-down.png"), ContentMode = UIViewContentMode.Left }; textField.RightView = arrowImageView; textField.RightViewMode = UITextFieldViewMode.UnlessEditing; textField.InputView = pickerView; var toolbar = CreateToolbar(); textField.InputAccessoryView = toolbar; textField.Layer.BorderColor = SaafiColors.BorderColor.CGColor; textField.Layer.BorderWidth = 1; textField.Layer.CornerRadius = 4; } private void CreateRecipientBinding(MvxFluentBindingDescriptionSet<SendView, SendViewModel> set) { set.Bind(recipientTextField).To(vm => vm.SelectedRecipient).OneWay(); _recipientTextPicker = new UIPickerView { ShowSelectionIndicator = true }; var recipientPickerViewModel = new MvxPickerViewModel(_recipientTextPicker); _recipientTextPicker.Model = recipientPickerViewModel; set.Bind(recipientPickerViewModel).For(p => p.ItemsSource).To(vm => vm.AllRecipients).OneWay(); set.Bind(recipientPickerViewModel).For(p => p.SelectedItem).To(vm => vm.SelectedRecipient).OneWayToSource(); } private void CreateCountryBinding(MvxFluentBindingDescriptionSet<SendView, SendViewModel> set) { set.Bind(countryTextField).To(vm => vm.SelectedCountry).OneWay(); _countryTextPicker = new UIPickerView { ShowSelectionIndicator = true }; var countryPickerViewModel = new MvxPickerViewModel(_countryTextPicker); _countryTextPicker.Model = countryPickerViewModel; set.Bind(countryPickerViewModel).For(p => p.ItemsSource).To(vm => vm.Countries).OneWay(); set.Bind(countryPickerViewModel).For(p => p.SelectedItem).To(vm => vm.SelectedCountry).OneWayToSource(); } private void CreateCityBinding(MvxFluentBindingDescriptionSet<SendView, SendViewModel> set) { set.Bind(cityTextField).To(vm => vm.SelectedCity).OneWay(); _cityTextPicker = new UIPickerView { ShowSelectionIndicator = true }; var cityPickerViewModel = new MvxPickerViewModel(_cityTextPicker); _cityTextPicker.Model = cityPickerViewModel; set.Bind(cityPickerViewModel).For(p => p.ItemsSource).To(vm => vm.Cities).OneWay(); set.Bind(cityPickerViewModel).For(p => p.SelectedItem).To(vm => vm.SelectedCity).OneWayToSource(); } private void CreateServiceBinding(MvxFluentBindingDescriptionSet<SendView, SendViewModel> set) { set.Bind(serviceTextField).To(vm => vm.SelectedService).OneWay(); _serviceTextPicker = new UIPickerView { ShowSelectionIndicator = true }; var servicePickerViewModel = new MvxPickerViewModel(_serviceTextPicker); _serviceTextPicker.Model = servicePickerViewModel; set.Bind(servicePickerViewModel).For(p => p.ItemsSource).To(vm => vm.Services).OneWay(); set.Bind(servicePickerViewModel).For(p => p.SelectedItem).To(vm => vm.SelectedService).OneWayToSource(); } private UIToolbar CreateToolbar() { var toolbar = new UIToolbar(new CGRect(0, 0, 320, 44)); var done = new UIBarButtonItem("OK", UIBarButtonItemStyle.Bordered, (sender, e) => { cityTextField.ResignFirstResponder(); countryTextField.ResignFirstResponder(); serviceTextField.ResignFirstResponder(); recipientTextField.ResignFirstResponder(); }) { TintColor = SaafiColors.AccentColor }; toolbar.SetItems(new[] { done }, false); return toolbar; } protected void UpdateUi() { View.AddGestureRecognizer(new UITapGestureRecognizer(() => { recipientTextField.ResignFirstResponder(); countryTextField.ResignFirstResponder(); cityTextField.ResignFirstResponder(); serviceTextField.ResignFirstResponder(); })); }
LinkerIncludePlease
public class LinkerIncludePlease { public void Include(UITextField textField) { textField.Text = textField.Text + ""; } public void Include(UIBarButtonItem button) { button.Clicked += (sender, e) => { button.Title = button.Title + "";}; } public void Include(UIButton uiButton) { uiButton.TouchUpInside += (s, e) => uiButton.SetTitle(uiButton.Title(UIControlState.Normal), UIControlState.Normal); } public void Include(IMvxCommand command) { command.CanExecuteChanged += (s, e) => { if (command.CanExecute(null)) command.Execute(null); }; } }
D. SetUp
protected override IMvxApplication CreateApp()
{
var dbConn = FileAccessHelper.GetLocalFilePath("saafimaster.db3");
Mvx.RegisterSingleton(new RecipientRepository(dbConn));
Mvx.RegisterSingleton(new TransferRepository(dbConn));
Mvx.RegisterSingleton(new SendRepository(dbConn));
return new Core.App();
}