UWP:在日历视图中绑定选定日期
UWP : Binding selected date in calendarview
我想在我的 XAML 日历视图中进行从我的 ViewModel 到选定日期(单个)的双向绑定。
但是我们没有依赖属性来做。
怎么办?
编辑:
我试过的代码,但我得到了错误。
它结合了这两个主题:
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);
}
}
}));
}
您需要创建 DateTimeOffset
的附加 属性,而不是 IList<DateTimeOffset>
,因为您只想 select 一个 日期。
因此,您需要这样的东西,而不是您从我的其他答案复制过来的代码 -
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
来清除所有之前 selected 的日期,因为 SelectionMode
设置为 Single
,而不是这样做, 将抛出错误。
然后您只需要将它连接到 xaml 和您的 SelectedDate
属性。
<CalendarView SelectionMode="Single"
DisplayMode="Month"
local:CalendarViewHelper.SelectedDate="{x:Bind SelectedDate, Mode=OneWay}" />
我想在我的 XAML 日历视图中进行从我的 ViewModel 到选定日期(单个)的双向绑定。 但是我们没有依赖属性来做。
怎么办?
编辑:
我试过的代码,但我得到了错误。
它结合了这两个主题:
<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);
}
}
}));
}
您需要创建 DateTimeOffset
的附加 属性,而不是 IList<DateTimeOffset>
,因为您只想 select 一个 日期。
因此,您需要这样的东西,而不是您从我的其他答案复制过来的代码 -
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
来清除所有之前 selected 的日期,因为 SelectionMode
设置为 Single
,而不是这样做, 将抛出错误。
然后您只需要将它连接到 xaml 和您的 SelectedDate
属性。
<CalendarView SelectionMode="Single"
DisplayMode="Month"
local:CalendarViewHelper.SelectedDate="{x:Bind SelectedDate, Mode=OneWay}" />