0

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.

  1. 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();
    }
    
  2. 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();
    
        }));
    }
    
  3. 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();
    }
Hakim
  • 9
  • 2
  • Does `Recipient` implement `INotifiyPropertyChanged` interface ? – Mark Verkiel Nov 13 '17 at 09:04
  • 1
    Possible duplicate of [iOS Mvvmcross app not rendering a drop-down list from db and getting bind errors when saving data to the db](https://stackoverflow.com/questions/47247410/ios-mvvmcross-app-not-rendering-a-drop-down-list-from-db-and-getting-bind-errors) – Cheesebaron Nov 13 '17 at 12:53
  • Thanks @Pilatus. I only have plain properties in my `Recipient` class. I am doing all my bindings in `RecipientViewModel` – Hakim Nov 13 '17 at 16:37
  • @Cheesebaron do you have an idea of what the issue is? Would appreciate a little help. – Hakim Nov 13 '17 at 17:04
  • @Cheesebaron Removed the possible duplicate post. Can you please update your comment in lieu of this. Thanks – Hakim Nov 14 '17 at 20:18

0 Answers0