WPF Datepicker使用MVVM返回先前选择的日期

时间:2013-12-18 13:07:12

标签: c# wpf mvvm datepicker

我正在开发一个WPF项目,我在Window上有一个Datepicker控件。我正在使用MVVM模式进行数据绑定。我已经在DateDicker的SelectedDate更改事件上设置了一个命令。问题是,例如,当我第一次更改日期时,我在命令的事件处理程序中得到 NULL 。当我再次更改日期时,我在事件处理程序中获得先前选择的日期。这是一种奇怪的行为,因为如果我不使用WPF命令并在模型后面的代码中工作,则不会发生这种情况。

以下是DatePicker的xaml代码段:

<DatePicker x:Name="dpEventDate" Grid.Row="1" Grid.Column="2" HorizontalAlignment="Stretch" Margin="150,0,150,0" 
            VerticalAlignment="Center" SelectedDateFormat="Long" 
            SelectedDate="{Binding Path=., Source={x:Static sys:DateTime.Today},  StringFormat=Today is {0:dddd, MMMM dd}}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectedDateChanged">
            <i:InvokeCommandAction Command="{Binding SelectedDateChangedCommand}"
                                   CommandParameter="{Binding ElementName=dpEventDate, Path=SelectedDate}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <DatePicker.Background>
        <SolidColorBrush Color="LightYellow"></SolidColorBrush>
    </DatePicker.Background>
</DatePicker>

ViewModel类中的命令事件处理程序

get
{
    return new DelegateCommand((sdate) =>
    {
        selectedDate = Convert.ToDateTime(sdate);
        if (sdate != null)
        {
            //some logic here
        }
    }  
}
set
{
    SelectedDateChangedCommand = value;
    RaisePropertyChangedEvent("SelectedDateChangedCommand");
}

DelegateCommand类实现ICommand

因此,在上面的代码中,“ sdate ”参数始终返回先前选择的日期。如果这是我第一次更改日期,则返回 NULL

知道我可能做错了吗?

1 个答案:

答案 0 :(得分:4)

我不确定您是通过将更改绑定到事件和命令来实现的。您是否有理由不绑定DatePicker的SelectedDate属性(使用TwoWay模式)?目前,您将其绑定到静态DateTime.Today

<DatePicker x:Name="dpEventDate" Grid.Row="1" Grid.Column="2" HorizontalAlignment="Stretch" Margin="150,0,150,0" 
      VerticalAlignment="Center" SelectedDateFormat="Long" 
      SelectedDate="{Binding MyDateTimeProperty, Mode=TwoWay}">

并在具有

的ViewModel中
private Nullable<DateTime> myDateTimeProperty = null;
public Nullable<DateTime> MyDateTimeProperty {
    get {
        if(myDateTimeProperty == null) {
            myDateTimeProperty = DateTime.Today;
        }
        return myDateTimeProperty;
    }
    set {
        myDateTimeProperty = value;
        RaisePropertyChangedEvent("MyDateTimeProperty");
    }
}

这样,ViewModel将返回当前日期并在DatePicker中设置它,如果之前的日期为null,并且DatePicker已更改,它将以新的方式将其绑定回属性。