我正在开发一个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 。
知道我可能做错了吗?
答案 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已更改,它将以新的方式将其绑定回属性。