我正在使用通用Windows平台构建Windows Phone 10应用程序。在我的应用程序中,我有一个标准的CalendarView,我想在有日期的日期显示密度颜色。这个想法是在页面加载后立即加载日历,发出API请求,并在成功的数据检索后让CalendarView刷新它的UI,以便调用CalendarViewDayItemChanging
事件。从那里我可以设置我的密度颜色的细胞有事件。UWP CalendarView更新命令
我几乎一切正常,除了一部分。当日历第一次加载时,我将它的最小/最大日期范围设置为当前月份,这样我们一次只能看到一个月。这会导致日历的UI按预期进行刷新。但是,如果我尝试再次将最小/最大日期范围设置为相同日期,那么API请求完成后,日历不会刷新其UI。由于这个原因,我无法强制CalendarView刷新它的UI。我已经尝试重置最小/最大日期范围,并且我试图将日历的DataContext绑定到我的代码中的ObservableCollection,后者在我的数据更新时更新。这些都不起作用,我没有看到任何方法来更新用户界面。
我对UWP很新,所以我不确定自己做错了什么。我知道数据绑定的概念是UWP的重要组成部分,但我不确定如何将数据绑定到此CalendarView,以便在刷新数据时刷新数据。有什么建议么?
下面是我的代码现在的快速摘录。
XAML
<CalendarView
Name="Calendar"
NumberOfWeeksInView="6"
CalendarViewDayItemChanging="CalendarView_DayItemChanging"
DataContext="{Binding CalendarDates}">
</CalendarView>
代码隐藏
namespace Pages
{
public sealed partial class CalendarPage : BasePage
{
#region Private Variables
private CalendarPageModel PageModel = new CalendarPageModel();
private ObservableCollection<DateTime> CalendarDates;
#endregion
#region Constructor
public CalendarPage()
{
this.InitializeComponent();
CalendarDates = new ObservableCollection<DateTime>();
}
#endregion
#region Events
private void Page_Loaded(object sender, RoutedEventArgs args)
{
SetCalendarDateRange(); //NOTE: This is done here so that my UI consistantly shows the correct dates on the screen
LoadData();
}
private void CalendarView_DayItemChanging(CalendarView sender, CalendarViewDayItemChangingEventArgs args)
{
if (!PageModel.DateHasEvent(args.Item.Date))
{
args.Item.SetDensityColors(null);
}
else
{
List<Color> colors = new List<Color>();
Color? color = Application.Current.Resources["CalendarHasEventDensityColor"] as Color?;
if (color != null)
{
colors.Add((Color)color);
}
args.Item.SetDensityColors(colors);
}
}
#endregion
#region Data
private void SetCalendarDateRange()
{
Calendar.MinDate = PageModel.StartDate;
Calendar.MaxDate = PageModel.EndDate;
}
private async void LoadData()
{
// get data
await PageModel.RefreshData(PageModel.StartDate, PageModel.EndDate);
// force calendar to update
//NOTE: This only works if the date range is actually different than what it's currently set to
SetCalendarDateRange();
//NOTE: I have tried to just manually add a date to my observable collection to see if it'll kick off the calendar refresh, but it doesn't
CalendarDates.add(DateTime.Now);
}
#endregion
}
}
当您更改MinDate和MaxDate但您没有完整的repro(其中'CalendarPageModel'?),因此在您的代码中无法看到问题出在哪里时,可以让日历更新UI。 'RefreshData'发生了什么?还有什么叫“LoadData”? –
这些都不重要。它被抽象出来,因为我唯一的问题是如何在不更改最小/最大日期的情况下更新日历。您可以假设loadData和refreshData调用获取数据并将数据存储到CalendarPageModel类中。此时此数据未连接到CalendarView。如果您愿意,我可以删除该代码。无论如何,问题是你如何刷新CalendarView,意味着调用上面概述的导师,而不改变最小/最大日期? –
对不起,Ruppe的。在手机上输入这个。 –