У меня есть 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);
}
}
Заранее спасибо.
Я пробовал это в MainPage.xaml: <Picker ItemsSource = "{x:Static local:Exercises.All}" ItemDisplayBinding = "{Binding MuscleGroup}" />
и этот код для класса 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; } }
Джейсон, я нашел еще одно простое решение: добавить средство выбора на 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; }
Извините, я не смог ввести код с новой строки.
Пожалуйста, не добавляйте дальнейшие пояснения в виде комментариев, а лучше редактировать вопрос.
Что вы думаете о моем пути? Вы можете предложить другие способы?





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