Как динамически загрузить данные в скользящее меню с помощью SlideOverKit? - PullRequest
0 голосов
/ 06 июля 2019

Я создаю кроссплатформенное приложение с использованием Xamarin Forms 4.0 в VS 2019.

Мне нужно всплывающее меню, параметры меню которого меняются в зависимости от выбранной даты ячейки в календаре.Я установил SlideOverKit, чтобы попытаться выполнить это.Получение самого меню работает, но динамическое изменение параметров не работает.

Как мне поступить?

Как я уже говорил, я пытался передать даты, но я также пытался сохранить дату в SecureStorage и запросить строку в методе загрузки SlideUpMenu.Возможно, я столкнулся с проблемой «жизненного цикла представления».

Здесь я передаю выбранную дату со страницы содержимого в представление слайд-меню и модель, содержащую данные.

   public partial class PublicCalendarPage : MenuContainerPage
    {
        private CalendarModel _calendarModel;
        private bool _showDetails = true;

        public PublicCalendarPage(CalendarModel calendarModel)
        {
            InitializeComponent();
            Content.BackgroundColor = Color.White;
            BindingContext = new PublicCalendarViewModel(this, new ApiService())
            {
                CalendarModel = GetCalendarModel(calendarModel)
            };
            _calendarModel = calendarModel;

            SlideMenu = new ShowMealsView(new DateTime(), calendarModel.CalendarDays);
        }

        private CalendarModel GetCalendarModel(CalendarModel calendarModel)
        {

            //gets the model data via api call
        }

         private void Schedule_OnCellTapped(object sender, CellTappedEventArgs e)
        {
            SlideMenu = new ShowMealsView(e.Datetime, _calendarModel.CalendarDays);
            ShowMenu();
        }
    }

Ниже приведен код для загрузки меню

    public partial class ShowMealsView : SlideMenuView
    {
        private readonly List<CalendarDayModel> _calendarDays;

        public ShowMealsView(DateTime eDatetime, List<CalendarDayModel> calendarDaysList)
        {
            InitializeComponent();
            HeightRequest = 80;
            IsFullScreen = true;
            MenuOrientations = MenuOrientation.BottomToTop;
            BackgroundColor = Color.LightGray;
            BackgroundViewColor = Color.Transparent;
            _calendarDays = calendarDaysList;
            if (Device.RuntimePlatform == Device.Android)
                this.HeightRequest += 50;

            var layout = GetLayout(eDatetime);

            Content = layout;

        }

        private Grid GetLayout(DateTime date)
        {
            var layout = new Grid();

            // formats grid layout before the relevant code

            var dinnerGrid = new Grid();
            dinnerGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
            dinnerGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(10, GridUnitType.Absolute) });
            dinnerGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });

            var dinnerBox = new BoxView
            {
                VerticalOptions = LayoutOptions.Fill,
                BackgroundColor = Color.FromHex("#f3d176")
            };
            dinnerGrid.Children.Add(dinnerBox, 0, 0);

            //var selectedDate = SecureStorage.GetAsync("SelectedDate").Result;
            var selectedDateTime = date;
            var dinnerLabel = new Label
            {
                Text = "Provide Dinner",
                TextColor = Color.Black,
                HorizontalOptions = LayoutOptions.Center,
                HorizontalTextAlignment = TextAlignment.Center,
                VerticalTextAlignment = TextAlignment.Center,
                VerticalOptions = LayoutOptions.Center
            };

            if (_calendarDays.Any(x => x.ForDay == selectedDateTime.Date && x.Email != null))
            {
                dinnerLabel = new Label
                {
                    Text = $"A DINNER EXISTS!",
                    TextColor = Color.Black,
                    HorizontalOptions = LayoutOptions.Center,
                    HorizontalTextAlignment = TextAlignment.Center,
                    VerticalTextAlignment = TextAlignment.Center,
                    VerticalOptions = LayoutOptions.Center
                };

            }

            dinnerGrid.Children.Add(dinnerLabel, 1, 0);

            var table = new TableView
            {
                Root = new TableRoot { new TableSection { new ViewCell() { View = lunchGrid }, new ViewCell() { View = dinnerGrid } } },
                Intent = TableIntent.Data
            };

            layout.Children.Add(table, 0, 0);

            return layout;
        }
    }

Первоначальная загрузка возвращает «Обеспечить ужин»

Как только выбранная дата сделана на странице содержимого, выбор меню долженвключают "УЖИН СУЩЕСТВУЕТ!"

Однако, несмотря на то, что отладка показывает, что dinnerLabel.Text может быть равен «A Dinner EXISTS», на экране всегда отображается «Обеспечить Dinner»

UPDATE: я перешел наиспользуя ObservableCollection, используя эту коллекцию в качестве источника элементов ListView, потому что я продолжаю читать, что ListView автоматически обновляет свои представления в зависимости от того, какие данные находятся в списке.(если что-то добавлено или удалено)

Это не работает, но я готов признать, что, возможно, я делаю это неправильно, поскольку я никогда не использовал ListViews ...

По существу, я 'я все еще получаю ТОЛЬКО исходное состояние представления, которое показывает только «Обеспечить ужин»;и снова при отладке свойство, назначенное в модели, имеет значение «A Dinner Exists!»... чтобы получить тот же результат с помощью этого другого метода

1 Ответ

1 голос
/ 08 июля 2019

Я думаю, что это ограничение из SlideOverKit, и вы не можете динамически изменять SlideMenu.

Я загружаю образец и использую ваш код для тестирования.Я сталкиваюсь с той же проблемой с тобой.

Тогда я нахожу похожую проблему здесь на Github, Автор рекомендует вам use binding IsVisible to show different view in a single slide menu.

Позже я нахожу другую проблему здесь о change SlideMenu dynamically и автор сказал:

Ну, это не может быть добавлено, причина OnAppearing будет вызвана после OnElementChanged.Как насчет изменения содержимого в MenuView во время выполнения?Как установить IsVisible для ViewA и невидимый для ViewB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...