【发布时间】:2017-02-07 11:52:19
【问题描述】:
我正在使用通用 Windows 平台构建 Windows Phone 10 应用程序。在我的应用程序中,我有一个标准的 CalendarView,我想在有事件的日期上显示密度颜色。这个想法是在页面加载后立即加载日历,发出 API 请求,并在成功检索数据后让 CalendarView 刷新它的 UI,以便调用 CalendarViewDayItemChanging 事件。从那里我可以为有事件的单元格设置我的密度颜色。
除了一个部件外,我几乎所有东西都正常工作。当日历第一次加载时,我将它的最小/最大日期范围设置为当前月份,这样我们一次只能看到一个月。这会导致日历的 UI 按预期刷新。但是,在我的 API 请求完成后,如果我尝试再次将最小/最大日期范围设置为相同的日期,那么日历不会刷新它的 UI。因此,我无法强制 CalendarView 刷新它的 UI。
我尝试调用 UpdateLayout,尝试重置最小/最大日期范围,并尝试将日历的 DataContext 绑定到后面的代码中的 ObservableCollection,该代码在我的数据更新时更新。这些都不起作用,我没有看到任何更新 UI 的方法。
我对 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 但您没有完整的重现(
CalendarPageModel是哪里?)时,绝对可以让日历更新 UI,所以看不出问题出在哪里在你的代码中。RefreshData会发生什么?还有什么叫LoadData? -
这些都不重要。它被抽象出来,因为我唯一的问题是如何在不更改最小/最大日期的情况下更新日历。您可以假设 loadData 和 refreshData 调用获取数据并将数据存储到 CalendarPageModel 类中。现在这个数据没有连接到 CalendarView。如果您愿意,我可以删除该代码。无论如何,问题是您如何刷新 CalendarView,这意味着调用我上面概述的导师,而不更改最小/最大日期?
-
顺便说一句,对不起 Ruppe's。在手机上输入。
-
我想我已经弄清楚了您的目标,但对原始问题感到困惑。将来,请注意stackoverflow.com/help/mcve 中记录的 repro 的值,因为这样可以避免由于引用未包含的代码而可能造成的混淆。
标签: c# calendar uwp windows-10-universal uwp-xaml