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中使用此控件?

最佳答案



我不知道是什么导致了这个问题,但是它返回的DateMinDate还要小。



您可以引用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/

10-12 13:21