我有两个日期选择器 - 一个用于“从”,另一个用于“到”。如果From日期变为大于To日期,我需要将To日期更改为From日期 - 反之亦然。目前,如果我在选择From日期后关注To日期的文本框,那么set属性将触发两次,从而重置正确的日期。但是,如果我从日历控件中选择一个日期而不是键入它,它可以正常工作。
这是我的xaml:
<Grid Grid.Row="1" VerticalAlignment="Top" BindingValidationError="dateVisitStartFrom_BindingValidationError">
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<StackPanel Grid.Row="1" Orientation="Horizontal">
<TextBlock Text="From: "></TextBlock>
<basics:DatePicker VerticalAlignment="Top" Height="20" x:Name="dateVisitStartFrom" SelectedDate="{Binding VisitStartDateFrom,Mode=TwoWay,NotifyOnValidationError=True,ValidatesOnExceptions=True}" Style="{StaticResource DatePickerStyle1}" >
<!--<interactivity:Interaction.Triggers>
<interactivity:EventTrigger EventName="BindingValidationError">
<MVVMLight:EventToCommand Command="{Binding RectifyDateValidationErrorCommand}"></MVVMLight:EventToCommand>
</interactivity:EventTrigger>
</interactivity:Interaction.Triggers>-->
</basics:DatePicker>
<TextBlock Text="To: " Margin="10,0,0,0"></TextBlock>
<basics:DatePicker x:Name="dateVisitStartTo" VerticalAlignment="Top" Height="20" SelectedDate="{Binding VisitStartDateTo,Mode=TwoWay,NotifyOnValidationError=True,ValidatesOnExceptions=True}" Style="{StaticResource DatePickerStyle1}"></basics:DatePicker>
</StackPanel>
</Grid>
这是VM:
private DateTime visitStartDateFrom = System.DateTime.Now.Subtract(new TimeSpan(7,0,0,0));
public DateTime VisitStartDateFrom
{
get
{
return visitStartDateFrom;
}
set
{
visitStartDateFrom = value;
if (visitStartDateFrom > visitStartDateTo)
{
throw new Exception();
//visitStartDateTo = visitStartDateFrom;
//OnPropertyChanged("VisitStartDateTo");
}
//OnPropertyChanged("VisitStartDateFrom");
}
}
private DateTime visitStartDateTo = System.DateTime.Now;
public DateTime VisitStartDateTo
{
get
{
return visitStartDateTo;
}
set
{
{
visitStartDateTo = value;
if (visitStartDateFrom > visitStartDateTo)
{
//visitStartDateFrom = visitStartDateTo;
//OnPropertyChanged("VisitStartDateFrom");
throw new Exception();
}
//OnPropertyChanged("VisitStartDateTo");
}
}
}
AND HEre是后面代码中的bindingvalidationerror函数。
private void dateVisitStartFrom_BindingValidationError(object sender, ValidationErrorEventArgs e)
{
if (e.Action == ValidationErrorEventAction.Added)
{
if (((DatePicker)e.OriginalSource).Name == "dateVisitStartFrom")
{
dateVisitStartFrom.Focus();
this.UpdateLayout();
dateVisitStartTo.SelectedDate = ((DatePicker)e.OriginalSource).SelectedDate;
}
else
{
dateVisitStartFrom.SelectedDate = ((DatePicker)e.OriginalSource).SelectedDate;
}
}
}
可以看出,我已经尝试了很多方法,但似乎没有什么可以纠正这个错误。任何解决方案都可以节省我的一天......
答案 0 :(得分:0)
这是我尝试的内容,我认为它可以完成您的目标。
XAML:
<sdk:DatePicker SelectedDate="{Binding FromDate,Mode=TwoWay}" />
<sdk:DatePicker SelectedDate="{Binding ToDate,Mode=TwoWay}"/>
代码:
private DateTime _FromDate= DateTime.Today.AddDays(-1);
public DateTime FromDate
{
get { return _FromDate; }
set
{
if (_FromDate != value)
{
_FromDate = value;
if (value > _ToDate)
{
_ToDate = value;
OnPropertyChanged("ToDate");
}
}
OnPropertyChanged("FromDate");
}
}
private DateTime _ToDate = DateTime.Today;
public DateTime ToDate
{
get { return _ToDate; }
set
{
if (_ToDate != value)
{
_ToDate = value;
if (value < _FromDate)
{
_FromDate = value;
OnPropertyChanged("FromDate");
}
}
OnPropertyChanged("ToDate");
}
}