如何在UWP MVVM中使用日历视图



我想绑定选定的日历视图项并将其设置为日期时间变量。

我的日历视图Xaml看起来像:

<CalendarView Grid.Row="6"  Grid.ColumnSpan="2"  VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="20"/>

我在Datacontext类中有一个DateTime项:

    private DateTime _DueDate;
    public DateTime DueDate
    {
        get { return this._DueDate; }
        set
        {
            if (this._DueDate != value)
            {
                this._DueDate = value;
                base.PropertyOnChanged("DueDate");
            }
        }
    } 

和DateTimeConverter:

    public class DateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        DateTime date = ((DateTime)value);
        return date.Day + "." + date.Month + "." + date.Year;
    }
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return DateTime.Parse((string)value);
    }
}

这也是文档到日历视图:

日历查看MSDN

文档中有一个属性SelectedDate,但我只在XAML SelectedDateChanged事件处理程序中看到。但我想在MVVM中做到这一点。

我的问题是我不知道我可以在哪个属性上设置结合我查看了文档,但只找到了Date=""属性来自DatePicker,但我在日历视图中找不到任何内容。

更新

根据的意见

@Juo Zuo:"CalendarView有一个SelectedDates属性。通常,我们可以使用此属性来设置所选日期,如:MyCalendarView.SelectedDates.Add(new DateTime(2016,5,5));。但是此属性是只读的,我们不能将其用于绑定。所以,恐怕没有办法使用binding设置所选的日期"

我想扩大这个问题。

我的问题是:

有什么方法可以将MSDN中的日历视图与MVVM模式一起使用吗?

您所需要做的就是创建一个附加属性并将SelectedDates.Add逻辑封装在其中。

public static class CalendarViewHelper
{
    public static IList<DateTimeOffset> GetSelectedDates(DependencyObject obj)
    {
        return (IList<DateTimeOffset>)obj.GetValue(SelectedDatesProperty);
    }
    public static void SetSelectedDates(DependencyObject obj, IList<DateTimeOffset> value)
    {
        obj.SetValue(SelectedDatesProperty, value);
    }
    public static readonly DependencyProperty SelectedDatesProperty =
        DependencyProperty.RegisterAttached("SelectedDates", typeof(IList<DateTimeOffset>), typeof(CalendarView), 
            new PropertyMetadata(null, (d, e) =>
            {
                var cv = d as CalendarView;
                var dates = e.NewValue as IList<DateTimeOffset>;
                if (cv != null && dates != null)
                {
                    foreach (var date in dates)
                    {
                        cv.SelectedDates.Add(date);
                    }
                }
            }));
}
<CalendarView local:CalendarViewHelper.SelectedDates="{x:Bind Dates, Mode=OneWay}" />

如果Dates属性中包含多个项目,请确保将SelectionMode更改为Multiple

最新更新