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