Search code examples
xamarindata-bindingpicker

xamarin picker SelectedItem returning null on observable collection


in my xamarin project, picker binding, the SelectedItem is not working. When I have the ItemSource set to a List, the SelectedItem works, but when I change the ItemSource to an ObservableCollection, the SelectedItem always returns null. Can someone see what I am doing wrong?

on loading the view, the pickers are populated through databinding. then on a button event I try and grab the SelectedItem.... which is when it is coming back as null.

xaml

        <Picker x:Name="PickerMarket2" Title="Market2" ClassId="PickerMarket2"
                ItemsSource="{Binding TestList2}"
                ItemDisplayBinding="{Binding ShortDesc}"
                SelectedItem="{Binding SelectedMarket}"
                Grid.Row="0" Grid.Column="1" >
        </Picker>

view model

    class VamiMarketViewModel: INotifyPropertyChanged
{
    private List<string> _testList;
    public List<string> TestList
    {
        get { return _testList; }
        set
        {
            {
                _testList = value;
                NotifyPropertyChanged();
            }
        }
    }

    private ObservableCollection<Performance> _testList2;
    public ObservableCollection<Performance> TestList2
    {
        get { return _testList2; }
        set
        {
            {
                _testList2 = value;
                NotifyPropertyChanged();
            }
        }
    }

    private string _selectedMarket;
    public string SelectedMarket
    {
        get { return _selectedMarket; }
        set
        {
            {
                _selectedMarket = value;
                NotifyPropertyChanged();
            }
        }
    }

Solution

  • I just explained the same in your other question here.

    To what I see from your code, the SelectedItem seems to be the problem. Since your Picker's ItemsSource(TestList property) is of type List<Performance>, the SelectedItem property bound to the Picker must be of type Performance. But, in your case, you have kept it as string instead of Performance.

    The ItemDisplayBinding must be the name of any property inside your Performance object which in your case is fine since you have a string property called ShortDesc inside your Performance class.

    That's the problem I see in your code. Change the type of the property ShortDesc like below and assign any one of the items in your collection TestList to it. Your code will start working fine.

    private Performance _shortDesc;
    public Performance ShortDesc
    {
       get { return _shortDesc; } 
       set
       {
           {
                _shortDesc = value;
                NotifyPropertyChanged();
           }
       }
    }
    

    Refer to the documentation here which explains a clear example for Binding objects to Picker.

    I hope that helps.