Как назначить Picker и свойство

У меня есть ListView (на MainPage), в котором перечислены упражнения, и ExercisePage для редактирования существующих или добавления новых элементов. Оно работает. Проблема в том, как использовать средство выбора для выбора MuscleGroup на ExercisePage (вместо MuscleGroupEntry) с сохранением изменений в экземпляре Exercise?

Я попытался использовать свойства ItemsSource и ItemDisplayBinding, как описано здесь Привязываемый сборщик, но это не сработало.

Спасибо за любую помощь! Вот мой код.

Класс упражнений:

    public class Exercise : INotifyPropertyChanged
{
    public enum muscleGroups
    {
        Back,
        Chest
    }

    public string title { get; set; }
    public muscleGroups muscleGroup { get; set; }

    public string Title
    {
        get { return title; }
        set
        {
            if (title != value)
            {
                title = value;
                OnPropertyChanged("Title");
            }
        }
    }

    public muscleGroups MuscleGroup
    {
        get { return muscleGroup; }
        set
        {
            if (muscleGroup != value)
            {
                muscleGroup = value;
                OnPropertyChanged("MuscleGroup");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string prop = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(prop));
    }

}

ExercisePage.xaml

        <StackLayout>
        <Entry x:Name = "titleEntry" Text = "{Binding Path=Title}"  />
        <Entry x:Name = "muscleGroupEntry" Text = "{Binding Path=MuscleGroup}" />
        <Button Text = "Save" Clicked = "SaveExercise" />
    </StackLayout>

ExercisePage.xaml.cs

    public partial class ExercisePage : ContentPage
{
    bool edited = true;
    public Exercise Exercise { get; set; }

    public ExercisePage (Exercise exercise)
    {
        InitializeComponent ();

        Exercise = exercise;
        if (exercise == null)
        {
            Exercise = new Exercise();
            edited = false;
        }
        this.BindingContext = Exercise;
    }

    async void SaveExercise(object sender, EventArgs e)
    {
        await Navigation.PopAsync();

        if (edited == false)
        {
            NavigationPage navPage = (NavigationPage)Application.Current.MainPage;
            IReadOnlyList<Page> navStack = navPage.Navigation.NavigationStack;
            MainPage homePage = navStack[navPage.Navigation.NavigationStack.Count - 1] as MainPage;

            if (homePage != null)
            {
                homePage.AddExercise(Exercise);
            }
        }
    }

MainPage.xaml

    <StackLayout>
    <Button Text = "Add" Clicked = "AddButton_Click" />
    <ListView x:Name = "exercisesList" ItemsSource = "{Binding}" ItemSelected = "OnListViewItemSelected">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <ViewCell.View>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width = "*" />
                                <ColumnDefinition Width = "*" />
                            </Grid.ColumnDefinitions>
                            <Label Text = "{Binding Title}" FontSize = "Medium" Grid.Column = "0" />
                            <Label Text = "{Binding MuscleGroup}" FontSize = "Medium" Grid.Column = "1" />
                        </Grid>
                    </ViewCell.View>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

MainPage.xaml.cs

    public partial class MainPage : ContentPage
{
    protected internal ObservableCollection<Exercise> Exercises { get; set; }

    public MainPage()
    {
        InitializeComponent();

        Exercises = new ObservableCollection<Exercise>
        {
            new Exercise {Title = "Exercise 1", MuscleGroup = Exercise.muscleGroups.Chest},
            new Exercise {Title = "Exercise 2", MuscleGroup = Exercise.muscleGroups.Chest},
            new Exercise {Title = "Exercise 3", MuscleGroup = Exercise.muscleGroups.Back},
            new Exercise {Title = "Exercise 4", MuscleGroup = Exercise.muscleGroups.Back}
        };
        exercisesList.BindingContext = Exercises;
    }

    private async void OnListViewItemSelected(object sender, SelectedItemChangedEventArgs args)
    {
        Exercise selectedExercise = args.SelectedItem as Exercise;
        if (selectedExercise != null)
        {
            exercisesList.SelectedItem = null;
            await Navigation.PushAsync(new ExercisePage(selectedExercise));
        }
    }

    private async void AddButton_Click(object sender, EventArgs e)
    {
        await Navigation.PushAsync(new ExercisePage(null));
    }

    protected internal void AddExercise(Exercise exercise)
    {
        Exercises.Add(exercise);
    }
}

Заранее спасибо.

где код для вашего сборщика?

Jason 08.04.2018 21:48

Я пробовал это в MainPage.xaml: <Picker ItemsSource = "{x:Static local:Exercises.All}" ItemDisplayBinding = "{Binding MuscleGroup}" />

Remin Maxim 08.04.2018 22:43

и этот код для класса Exercise: static List<Exercise> _allExercises; public static List<Exercise> All { get { if (_allExercises == null) { _allExercises = new List<Exercise> { new Exercise { Title = "Exercise 1", MuscleGroup = Exercise.muscleGroups.Chest}, ... }; } return _allExercises; } }

Remin Maxim 08.04.2018 22:47

Джейсон, я нашел еще одно простое решение: добавить средство выбора на ExercisePage <Picker x:Name = "picker" Title = "Choose a muscle group"> <Picker.Items> <x:String>Chest</x:String> <x:String>Back</x:String> </Picker.Items> </Picker> и (в ExercisePage.xaml.cs) в метод SaveExercise добавить этот код: switch (picker.SelectedItem) { case "Chest": Exercise.MuscleGroup = Exercise.muscleGroups.Chest; break; case "Back": Exercise.MuscleGroup = Exercise.muscleGroups.Back; break; default: break; }

Remin Maxim 08.04.2018 23:27

Извините, я не смог ввести код с новой строки.

Remin Maxim 08.04.2018 23:28

Пожалуйста, не добавляйте дальнейшие пояснения в виде комментариев, а лучше редактировать вопрос.

Paul Kertscher 09.04.2018 07:09

Что вы думаете о моем пути? Вы можете предложить другие способы?

Remin Maxim 09.04.2018 10:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
46
0

Другие вопросы по теме