显示约会在UWP日历视图中的日期项。

4

我想做的是,在日历视图中的CalendarViewDayItem中显示与当天相关的约会。

我的约会类:

public class CalJobItemVM : ViewModelBase
{
    public CalJobItemVM() { }
    public CalJobItemVM(ServiceJob serviceJob)
    {
        Title = serviceJob.EON
        Date = serviceJob.StartDate
    }
    private string _title;
    public string Title
    {
        get { return _title; }
        set { Set(ref _title, value); }
    }
    private DateTimeOffset _date;
    public DateTimeOffset Date
    {
        get { return _date; }
        set { Set(ref _date, value); }
    }
}

在我的Page.Resources中,我有以下结构:
<Style TargetType="CalendarViewDayItem">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="CalendarViewDayItem">
                <ListView>
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <Grid Height="26" HorizontalAlignment="Stretch">
                                <TextBlock Text="{Binding Title}"/>
                            </Grid>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

理论上,我想将List绑定到CalendarView的ItemsSource上,根据日期,应该向CalendarViewDayItem的ItemsSource添加一些预约。不幸的是,我没有找到任何方法来实现这个目标。绑定结构应该如下:

CalendarView (ItemsSource = List<CalJobItemVM>())
     |-> CalendarViewDayItem (ItemsSource = CalendarView.ItemsSource.Where(x=>x.Date == CalendarViewDayItem.Date)
              |-> ListView (ItemsSource = CalendarViewDayItem.ItemsSource)

或者:

CalendarView (ItemsSource = List<CalJobItemVM>())
     |-> ListView (ItemsSource = CalendarView.ItemsSource.Where(x=>x.Date == ParentControl.Date)

要么覆盖ListView的ItemsSource,使其过滤由父控件(CalendarViewDayItem)的Date-Value筛选出的CalJobItemMV集合。

我知道CalendarView和CalendarViewDayItem没有ItemsSource属性,因此我希望能得到一些建议,以便修改这两个控件,使它们支持ItemsSource。

此外,任何不使用代码后台的替代方法都非常欢迎。


所以我也希望能得到一个建议,如何修改这两个控件,使它们支持ItemsSource。那么你的意思是想自定义一个控件吗? - Sunteen Wu
我更喜欢只使用样式,但如果没有其他解决方案,我也会使用自定义控件。 - Raymond Osterbrink
1个回答

4
请参考渐进式呈现的示例。此示例允许您使用SetDensityColors方法为每天添加彩色条形,但这可能更适合小型日历视图。
如果必须列出项目列表,则可以执行以下操作:
<CalendarView CalendarViewDayItemChanging="OnCalendarViewDayItemChanging"
              HorizontalDayItemAlignment="Right" VerticalDayItemAlignment="Top">
    <CalendarView.CalendarViewDayItemStyle>
        <Style TargetType="CalendarViewDayItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="CalendarViewDayItem">
                        <Grid Margin="0,40,0,0">
                            <ListView ItemsSource="{Binding}">
                                <ListView.ItemTemplate>
                                    <DataTemplate>
                                        <Grid Height="26" HorizontalAlignment="Stretch">
                                            <TextBlock Text="{Binding Title}"/>
                                        </Grid>
                                    </DataTemplate>
                                </ListView.ItemTemplate>
                            </ListView>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </CalendarView.CalendarViewDayItemStyle>
</CalendarView>

在您的代码后台,设置该项的数据上下文:
private void OnCalendarViewDayItemChanging(CalendarView sender, CalendarViewDayItemChangingEventArgs args)
{
    // Render basic day items.
    if (args.Phase == 0)
    {
        // Register callback for next phase.
        args.Item.DataContext = GetCalJobItemVM(args.Item.Date);
    }
}

谢谢,我会尽快测试它。 - Raymond Osterbrink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接