私は、Universal Windows Platformを使用してWindows Phone 10アプリケーションを構築しています。私のアプリでは、標準のCalendarViewを使用して、イベントのある日付の濃度を表示したいと考えています。このアイデアは、ページがロードされるとすぐにカレンダーをロードし、APIリクエストを行い、データ検索が成功するとCalendarViewがUIをリフレッシュしてCalendarViewDayItemChanging
イベントが呼び出されるようにします。そこから、イベントを持つセルのための私の密度の色を設定することができます。コマンドのUWP CalendarViewアップデート
私は、1つの部分を除いてすべて正常に動作しています。カレンダーが最初に読み込まれるとき、私は一ヶ月に一ヶ月しか見ることができないように、現在の月の最小/最大の日付範囲を設定します。これにより、予定表の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のために申し訳ありません。これを電話で入力します。 –