【问题标题】:UWP : Binding selected date in calendarviewUWP:在日历视图中绑定选定日期
【发布时间】:2017-05-02 15:45:46
【问题描述】:

我想从我的 ViewModel 到我的 XAML 日历视图中的选定日期(单个)进行两种方式绑定。 但是我们没有依赖属性来做这件事。

怎么办?

编辑: 我试过的代码,但我得到了错误。 它结合了这两个主题: How to use CalenderView in UWP MVVM How to select rang of dates on finger slide on Calendar Control - UWP Win10 VS2015 XAML:

<CalendarView  MinHeight="250" MaxHeight="500" MaxWidth="720"   FontWeight="Normal" 
             DayItemFontWeight="Light" MinWidth="100"
                          SelectionMode="Single"
                          Style="{StaticResource Mahcalenderstyle}" Visibility="Visible" 
             HorizontalAlignment="Stretch" x:Name="MyCalendarView" DisplayMode="Month" Margin="9,25,9,0"
             VerticalAlignment="Top" SelectedDatesChanged="CalendarView_SelectedDatesChanged"
             CalendarViewDayItemStyle="{StaticResource CalendarViewDayItemStyle1}"
                          />

还有我的虚拟机:

 private DateTimeOffset _selecteddate;
    public DateTimeOffset SelectedDate
    {
        get
        {
            return _selecteddate;

        }
        set
        {

            if (_selecteddate != value)
            {
                _selecteddate = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this,
                        new PropertyChangedEventArgs("SelectedDate"));
                }
            }
        }
    }
    public CalendarViewModel()
    {

        SelectedDate = DateTimeOffset.Now;}

帮手:

 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);
                    }
                }
            }));

}

【问题讨论】:

标签: c# xaml mvvm uwp bind


【解决方案1】:

您需要创建DateTimeOffset 的附加属性,而不是IList&lt;DateTimeOffset&gt;,因为您只想选择一个日期。

因此,您将需要这样的代码,而不是您从我的其他答案中复制的代码 -

public static class CalendarViewHelper
{
    public static DateTimeOffset GetSelectedDate(DependencyObject obj)
    {
        return (DateTimeOffset)obj.GetValue(SelectedDateProperty);
    }

    public static void SetSelectedDate(DependencyObject obj, DateTimeOffset value)
    {
        obj.SetValue(SelectedDateProperty, value);
    }

    public static readonly DependencyProperty SelectedDateProperty =
        DependencyProperty.RegisterAttached("SelectedDate", typeof(DateTimeOffset), typeof(CalendarView),
            new PropertyMetadata(null, (d, e) =>
            {
                var cv = (CalendarView)d;
                var date = (DateTimeOffset)e.NewValue;

                cv.SelectedDates.Clear();
                cv.SelectedDates.Add(date);
            }));
}

请注意,您需要调用Clear 来清除所有之前选择的日期,因为SelectionMode 设置为Single,否则将引发错误。

然后,您只需将它与您的 SelectedDate 属性连接到 xaml 中。

<CalendarView SelectionMode="Single"
                  DisplayMode="Month"
                  local:CalendarViewHelper.SelectedDate="{x:Bind SelectedDate, Mode=OneWay}" />

【讨论】:

  • 嘿,我在 this.InitializeComponent(); 中遇到了和以前一样的错误。 Windows.UI.Xaml.Markup.XamlParseException:'找不到与此错误代码关联的文本。未能分配给属性“Denna.Classes.CalendarViewHelper.SelectedDate”。 [行:60 位置:58]'
  • 我不知道为什么当我从本地属性 x:bind 时它确实很好,但是当我从我的 VM 使用绑定时它会出现问题:(
  • 将您的代码放入示例项目中,然后将链接发送给我。
  • FIWED。谢谢。
  • 很酷,你想通了! :)
猜你喜欢
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多