Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selected item not working in Picker

In our edit page, we have an issue to populate the value into Selected Item in picker and it won't select for some reason from the LoadCourses() or LoadRoundCategories() either.

Any ideas?

Here's the code:

ViewModel

public class EditGolfRoundViewModel : INotifyPropertyChanged
{
    ApiServices _apiServices = new ApiServices();

    private string _message;
    private ObservableCollection<GolfCourse> _courses;
    private ObservableCollection<GolfRoundCategory> _roundCategories;
    private object_selectedGolfCourse;
    private GolfRoundCategory _selectedGolfRoundCategory;
    private GolfRound _golfRound;

    public EditGolfRoundViewModel()
    {
        _selectedGolfCourse = new GolfCourse();
        _selectedGolfRoundCategory = new GolfRoundCategory();
        LoadCourses();
        LoadRoundCategories();
    }

    public GolfRound GolfRound
    {
        get { return _golfRound; }
        set
        {
            _golfRound = value;
            OnPropertyChanged();
        }
    }


    public string Message
    {
        get { return _message; }

        set
        {
            _message = value;
            OnPropertyChanged();
        }
    }

    public ObservableCollection<GolfCourse> GolfCourses
    {
        get { return _courses; }
        set
        {
            if (_courses != value)
            {
                _courses = value;
                OnPropertyChanged();
            }

        }
    }

    public ObservableCollection<GolfRoundCategory> GolfRoundCategories
    {
        get { return _roundCategories; }
        set
        {
            _roundCategories = value;
            OnPropertyChanged();
        }
    }

    public object SelectedGolfCourse
    {
        get { return _selectedGolfCourse; }
        set
        {
            _selectedGolfCourse = value;
            var golfCourse = _selectedGolfCourse as GolfCourse;
            Guid tempGolfCourseID = golfCourse.GolfCourseID;
            OnPropertyChanged("SelectedGolfCourse");
        }
    }


    public GolfRoundCategory SelectedGolfRoundCategory
    {
        get { return _selectedGolfRoundCategory; }
        set
        {
            _selectedGolfRoundCategory = value;
            OnPropertyChanged();
        }
    }



    public ICommand EditCommand 
    { 
        get
        {
            return new Command(async() =>
            {
                GolfRound.GolfCourseID = SelectedGolfCourse.GolfCourseID;
                GolfRound.GolfCourse = SelectedGolfCourse;
                GolfRound.GolfRoundCategoryID = SelectedGolfRoundCategory.GolfRoundCategoryID;
                GolfRound.GolfRoundCategory = SelectedGolfRoundCategory;
                GolfRound.LastModifiedUTC = System.DateTime.Now;

                await _apiServices.PutGolfRoundAsync(GolfRound, Settings.AccessToken);
            });
        }

    }

    public ICommand DeleteCommand
    {
        get
        {
            return new Command(async () =>
            {
                await _apiServices.DeleteGolfRoundAsync(GolfRound.GolfRoundID, Settings.AccessToken);
            });
        }

    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private async void LoadCourses()
    {
        GolfCourses = new ObservableCollection<GolfCourse>(await _apiServices.GetGolfCoursesAsync(Settings.AccessToken));
    }

    private async void LoadRoundCategories()
    {
        GolfRoundCategories = new ObservableCollection<GolfRoundCategory>(await _apiServices.GetGolfRoundCategoriesAsync(Settings.AccessToken));
    }

}

View - XAML

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:viewModels="clr-namespace:AthlosifyMobile.ViewModels.Golf"
         x:Class="AthlosifyMobile.Views.EditGolfRoundPage">

<StackLayout Orientation="Vertical" VerticalOptions="Center" Spacing="30" Padding="30">
    <Entry Text="{Binding GolfRound.Name}" Placeholder="name" FontSize="Default" />
    <Entry Text="{Binding GolfRound.Notes}" Placeholder="notes" FontSize="Default" />
    <Entry Text="{Binding GolfRound.DailyHandicap}" Placeholder="daily handicap" FontSize="Default" />
    <Label Text="Date" />
    <DatePicker Date="{Binding GolfRound.TeeOffUTC}" 
                Format="D"
                Margin="30, 0, 0, 30"  />
    <Picker x:Name="pCourse" Title="Course" ItemsSource="{Binding GolfCourses}" 
            SelectedItem="{Binding SelectedGolfCourse, Mode=TwoWay}" 
            ItemDisplayBinding="{Binding Name}"></Picker>
    <Entry Text="{Binding GolfRound.GolfCourse.Name}" Placeholder="selected golf course" FontSize="Default" />
    <Picker x:Name="pCategory" Title="Category" ItemsSource="{Binding GolfRoundCategories}" 
            SelectedItem="{Binding SelectedGolfRoundCategory, Mode=TwoWay}"
            ItemDisplayBinding="{Binding Name}"></Picker>
    <Entry Text="{Binding SelectedGolfRoundCategory.Name}" Placeholder="selected round category" FontSize="Default" />
    <Button Command="{Binding EditCommand}" Text="Edit Round" />
    <Button Command="{Binding DeleteCommand}" Text="Delete Round" />

    <Label Text="{Binding Message}" ></Label>
</StackLayout>

View - code behind

public partial class EditGolfRoundPage : ContentPage
{
    public EditGolfRoundPage (GolfRound round)
    {
        var editGolfRoundViewModel = new EditGolfRoundViewModel();
        editGolfRoundViewModel.GolfRound = round;

        BindingContext = editGolfRoundViewModel;

        InitializeComponent ();

        //var editGolfRoundViewModel = new EditGolfRoundViewModel();
        //editGolfRoundViewModel.GolfRound = round;
        //editGolfRoundViewModel.SelectedGolfCourse = round.GolfCourse;

        //BindingContext = editGolfRoundViewModel;

    }
}
like image 943
dcpartners Avatar asked Aug 05 '18 05:08

dcpartners


2 Answers

The following is true as of Xamarin Forms v4.7.

See if you are doing this:

<Picker x:Name="DefaultEntitlement" Title="Entitlement"
    SelectedItem="{Binding SelectedOwnerEntitlement, Mode=TwoWay}"
    ItemsSource="{Binding OwnerEntitlements, Mode=TwoWay}">
</Picker>

Instead of this:

<Picker x:Name="DefaultEntitlement" Title="Entitlement"
    ItemsSource="{Binding OwnerEntitlements, Mode=TwoWay}"
    SelectedItem="{Binding SelectedOwnerEntitlement, Mode=TwoWay}">
</Picker>
like image 74
Rajitha Wijayaratne Avatar answered Nov 06 '22 02:11

Rajitha Wijayaratne


Implement IEquatable for class of property used in SelectedItem:

public class GolfCourse : IEquatable<GolfCourse>
{
    ...
    public bool Equals(GolfCourse other)
    {
        if (other == null) return false;
        return (this.Name.Equals(other.Name));
    }
}

Usage, assuming ItemsSource contains an object with value of Name as shown below:

SelectedGolfCourse = new GolfCourse { Name = "Course 2" };
like image 44
Benl Avatar answered Nov 06 '22 02:11

Benl