UWP应用非常简单。一个ViewModel,其属性由包含CalendarDatePicker的Page绑定(bind)。
查看模型:
public class MainPageViewModel : INotifyPropertyChanged
{
private DateTimeOffset date;
public MainPageViewModel()
{
}
public event PropertyChangedEventHandler PropertyChanged;
public DateTimeOffset Date
{
get { return date; }
set
{
date = value;
OnPropertyChanged();
}
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
页:
<Page
x:Class="App2.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App2"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.DataContext>
<local:MainPageViewModel />
</Page.DataContext>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<CalendarDatePicker />
</Grid>
</Page>
我运行此应用程序,并且
CalendarDatePicker
的行为符合预期。在未选择日期的情况下启动,展开后默认显示为今天的日期时,显示“选择日期”字样。当我将
CalendarDatePicker
Date
属性绑定(bind)到我的虚拟机的Date并运行该应用程序时,该日期默认为1916年4月16日。我尝试将
Date
设置为可空,将绑定(bind)模式更改为TwoWay
,但无济于事。有没有人遇到过同样的问题?如何在MVVM中使用此控件?
最佳答案
我不知道是什么导致了这个问题,但是它返回的Date
比MinDate还要小。
您可以引用CalendarDatePicker class进行查看,您的MinDate
是“1916年4月16日”,而我现在是“3/15/1916 4:27:52 PM +08:00”。
但是我发现您的类MainPageViewModel : INotifyPropertyChanged
中存在问题。
如果您检查CalendarDatePicker.Date property,您会发现Date
不是DateTimeOffset
的类型,它的类型是Nullable<DateTimeOffset>
。
这就是我的工作方式。
MainPage XAML代码:
<Page
x:Class="CalendarDatePickerInMVVM.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:CalendarDatePickerInMVVM"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<CalendarDatePicker x:Name="picker" HorizontalAlignment="Center" Date="{x:Bind MainPageViewModel.Date}" />
<TextBox x:Name="txt" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" />
</Grid>
</Page>
MainPage.cs后面的代码:
public sealed partial class MainPage : Page
{
private ViewModel.MainPageViewModel MainPageViewModel;
public MainPage()
{
this.InitializeComponent();
txt.Text = picker.MinDate + "......" + picker.MaxDate;
MainPageViewModel = new ViewModel.MainPageViewModel();
}
}
和类
MainPageViewModel : INotifyPropertyChanged
:public class MainPageViewModel : INotifyPropertyChanged
{
private System.Nullable<DateTimeOffset> date;
public MainPageViewModel()
{
}
public event PropertyChangedEventHandler PropertyChanged;
public System.Nullable<DateTimeOffset> Date
{
get { return date; }
set
{
date = value;
OnPropertyChanged();
}
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
如果要为
CalendarDatePicker
设置默认值,则可以这样编码:private System.Nullable<DateTimeOffset> date = new DateTime(2016, 3, 15);
关于c# - 无法在MVVM中获得UWP行为中的CalendarDatePicker,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35977726/