C# 如何使用SlideOverKit将数据动态加载到滑动菜单中?

C# 如何使用SlideOverKit将数据动态加载到滑动菜单中?,c#,mvvm,xamarin.forms,C#,Mvvm,Xamarin.forms,我正在VS2019中使用Xamarin Forms 4.0创建一个跨平台应用程序 我需要一个向上滑动的菜单,它的菜单选项根据日历选择中点击的单元格日期而变化。我安装了SlideOverKit来尝试实现这一点。获取菜单本身是有效的,但动态更改选项是无效的 我应该如何进行 正如我所说,我已经尝试过传递日期,但我也尝试过将日期保存到SecureStorage,并在SlideUpMenu的加载方法中请求字符串。。。我相信我可能遇到了“视图的生命周期”问题 在这里,我将所选日期从内容页传递到幻灯片菜单视图

我正在VS2019中使用Xamarin Forms 4.0创建一个跨平台应用程序

我需要一个向上滑动的菜单,它的菜单选项根据日历选择中点击的单元格日期而变化。我安装了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可能等于存在晚餐,但屏幕上实际显示的始终是提供晚餐

更新: 我已经切换到使用ObservableCollection,将该集合用作ListView itemsource,因为我一直在读取该ListView,它会根据列表中的数据自动更新其视图。如果添加或删除了任何内容

这不起作用,但我愿意承认我可能做错了,因为我从未使用过ListView

从本质上说,我仍然只能看到只有表演才能提供晚餐的原始状态;同样,当调试模型中指定的属性时,该属性的值确实存在。。。因此,使用这种不同的方法得到相同的结果

我认为这是SlideOverKit的一个限制,您无法动态更改SlideMenu

我下载示例并使用您的代码进行测试。我和你遇到了同样的问题

然后我在Github上发现了一个类似的问题,作者建议您使用binding IsVisible在单个幻灯片菜单中显示不同的视图

后来,我发现了另一个关于动态更改SlideMenu的问题,作者说:

好吧,它不能被添加,出现的原因将被调用后 一个元素改变了。在运行时更改MenuView中的内容如何? Like集合对ViewA可见,对ViewB不可见


这就是我所走的路线,用的是可见布尔值。似乎是这样。。。gross@csharpmentor您看到源代码了吗?您可以修改它以满足您的要求。