Как связать выбранное значение в пике и сохранить эту страницу редактирования? - PullRequest
0 голосов
/ 07 октября 2019

У меня есть страница редактирования, где у нее есть идентификатор, переданный со страницы сведений. Затем позвонил в службу веб-API, чтобы получить Категории и Активность. Этот код, приведенный ниже, был адаптирован со страницы «Добавить» между прочим.

У него есть 2 проблемы:

  1. Удалось получить список выбора, НО, затем не уверен, как связать это из выбранной операции.
  2. Как сохранить это, так как имя привязки отличается в XAML, т.е. Activity.Name VS Имя и т. Д. И т. Д. Что я сделал не так?

Как это решить?

Код ниже:

ActivityEditPage.xaml

<?xml version="1.0" encoding="utf-8" ?>

<ContentPage.Content>
    <StackLayout  Margin="5,5,5,5" VerticalOptions="StartAndExpand">
        <Entry Placeholder="Name" Text="{Binding Activity.Name}"></Entry>
        <Picker ItemsSource="{Binding Categories}" ItemDisplayBinding="{Binding Name}"  SelectedItem="{Binding Activity.CategoryId}">
        </Picker>
        <Entry Placeholder="No of minutes" Text="{Binding Activity.NoOfMinutes}"></Entry>
        <Editor Placeholder="Description" Text="{Binding Activity.Description}"></Editor>
        <Button Text="Save" BackgroundColor="#340E22" FontSize="Small" TextColor="White" CornerRadius="30" HeightRequest="40" Command="{Binding SaveCommand}"></Button>
    </StackLayout>
</ContentPage.Content>

Код позади:

    using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace AthlosifyMobileApp.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class ActivityEditPage : ContentPage
    {
        public ActivityEditPage(int id)
        {
            InitializeComponent();
            BindingContext = new ActivityEditViewModel(Navigation, id);
        }

    }
}

ActivityEditViewModel.cs:

using AthlosifyMobileApp.Helpers;
using AthlosifyMobileApp.Models;
using AthlosifyMobileApp.Services;
using AthlosifyMobileApp.Views;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using Xamarin.Essentials;
using Xamarin.Forms;

namespace AthlosifyMobileApp.ViewModels
{
    public class ActivityEditViewModel : BaseViewModel
    {
        private readonly ApiService apiService = new ApiService();

        private int _id;
        private string _name;
        private string _description;
        private int _noOfMinutes;
        private int _categoryId;
        private string _categoryName;
        private Command _saveCommand;
        private List<Category> _categories;
        private Category _selectedCategory;
        private Activity _activity;

        public ActivityEditViewModel(INavigation navigation, int Id)
        {
            this.Navigation = navigation;
            Task.Run(async () =>
            {
                await GetCategories();
                Activity = await GetActivity(Id);
            });
        }

        public INavigation Navigation { get; set; }

        public Activity Activity
        {
            get { return _activity;  }
            set
            {
                _activity = value;
                OnPropertyChanged();
            }
        }

        public int Id
        {
            get { return _id; }
            set
            {
                _id = value;
                OnPropertyChanged();
            }
        }

        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                OnPropertyChanged();
                SaveCommand.ChangeCanExecute();
            }
        }

        public string Description
        {
            get { return _description; }
            set
            {
                _description = value;
                OnPropertyChanged();
            }
        }

        public int  NoOfMinutes
        {
            get { return _noOfMinutes; }
            set
            {
                _noOfMinutes = value;
                OnPropertyChanged();
            }
        }

        public int CategoryId
        {
            get { return _categoryId; }
            set
            {
                _categoryId = value;
                OnPropertyChanged();
            }
        }

        public string CategoryName
        {
            get { return _categoryName; }
            set
            {
                _categoryName = value;
                OnPropertyChanged();
            }
        }

        public List<Category> Categories
        {
            get { return _categories; }
            set
            {
                _categories = value;
                OnPropertyChanged("Categories");
            }
        }

        public Category SelectedCategory
        {
            get
            {
                return _selectedCategory;
            }
            set
            {
                _selectedCategory = value;
                OnPropertyChanged();
            }
        }

        public Command SaveCommand
        {
            get
            {
                return _saveCommand ?? (_saveCommand = new Command(ExecuteSaveCommand, CanSave));
            }
        }


        async void ExecuteSaveCommand()
        {
            var newItem = new Activity
            {
                Id = Id,
                OwnerId = Preferences.Get(Constant.Setting_UserId, ""),
                Name = Name,
                CategoryId = SelectedCategory.Id,
                CategoryName = SelectedCategory.Name,
                Description = Description,
                NoOfMinutes = NoOfMinutes
            };

            var response = await apiService.UpdateActivity(Id, newItem);
            if (!response)
            {
                await Application.Current.MainPage.DisplayAlert("Error", "Something wrong", "Alright");
            }
            else
            {
                await Navigation.PushAsync(new ActivityListPage());
            }
        }

        bool CanSave()
        {
            return !string.IsNullOrWhiteSpace(Name);
        }

        public async Task<List<Category>> GetCategories()
        {
            CategoryResult categoryResult = await apiService.GetCategories();
            return Categories = categoryResult.Results;
        }

        public async Task<Activity> GetActivity(int id)
        {
            Activity activity = await apiService.GetActivity(id);
            return activity;
        }
    }
}

ОБНОВЛЕННЫЙ КОД

Category.cs

    public class Category
{
    public int Id { get; set; }
    public string OwnerId { get; set; }
    public int ParentId { get; set; }
    public string ParentName { get; set; }
    public string Name { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime? ModifiedDate { get; set; }
}

Activity.cs:

 public class Activity
{
    public int Id { get; set; }
    public string OwnerId { get; set; }
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public int NoOfMinutes { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime? ModifiedDate { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...