Suraj
Suraj

Reputation: 433

MvxSpinner in Mvvmcross

I have three MvxSpinners in my android view. These spinners are binded to three different lists. and Mode of data binding is TwoWay for these spinners.i.e. when this view is displayed,all of these three spinners are get displayed with the predefined values.

When user change the value in first spinner,then second spinner will be clear and  
get loaded with new values based on the selected value in first spinner.

How can I achieve this?

Upvotes: 1

Views: 501

Answers (2)

ozapa
ozapa

Reputation: 281

I had the same problem but only if you add null value (as a default value) to your ItemsSource and try to reset SelectedItem to null. SelectedItem is changed in ViewModel but not in the spinner. In that case there's number of solutions but I used message to inform View to set selected item

public class SpinnerSelectionChanged : MvxMessage
{
    public SpinnerSelectionChanged(object sender, string spinnerName, int position): base(sender)
    {
        SpinnerName = spinnerName;
        Position = position;
    }

    public string SpinnerName { get; set; }
    public int Position { get; set; }
}

in View

private void OnSpinnerSelectionChanged(SpinnerSelectionChanged obj)
{
    switch (obj.SpinnerName)
    {
        case "City":
            _spinnerCity.SetSelection(obj.Position);
            break;
        case "Office":
            _spinnerOffice.SetSelection(obj.Position);
            break;
    }
}

Upvotes: 0

Jon Douglas
Jon Douglas

Reputation: 13176

There's many ways to accomplish this, where the code placement is really up to you. Overall the idea would be to have a "SelectedItem" object that you can pass into your method and "Load" the next List.

Please keep in mind that this code is more traditional MVVM, but can easily be converted to MVVMCross equivalent. I believe all these types should be supported by MVVMCross.

        private MyFirstObject _selectedFirstObject;

        public MyFirstObject SelectedFirstObject
        {
            get { return _selectedFirstObject; }
            set
            {
                _selectedFirstObject = value;
                RaisePropertyChanged("SelectedFirstObject");
                if(value != null)
                LoadMySecondObjects(value);
            }

        }

        private ObservableCollection<MyFirstObject> _myFirstObjects;

        public ObservableCollection<MyFirstObject> MyFirstObjects
        {
            get { return _myFirstObjects; }
            set
            {
                _myFirstObjects = value;
                RaisePropertyChanged("MyFirstObjects");
            }
        }

        private ObservableCollection<MySecondObject> _mySecondObjects;

        public ObservableCollection<MySecondObject> MySecondObjects
        {
            get { return _mySecondObjects; }
            set
            {
                _mySecondObjects = value;
                RaisePropertyChanged("MySecondObjects");
            }
        }

        public void LoadMySecondObjects(MyFirstObject current)
        {
           //Wherever you're pulling data from
           MySecondObjects = MyDataService.GetAll(current);
        }

        protected void RaisePropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

Upvotes: 1

Related Questions