У меня есть два выбора даты - один для «От» и другой для «До».У меня есть требование изменить дату «Дата» на дату «С», если дата «Дата начала» становится больше, чем дата «На», и наоборот.В настоящее время заданное свойство срабатывает дважды, если я фокусируюсь на текстовом поле Дата до после выбора даты От, тем самым сбрасывая правильную дату.Однако, если я выберу дату из календаря вместо ее ввода, она будет работать нормально.
Вот мой 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>
Вот виртуальная машина:
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");
}
}
}
И вот здесь в коде есть функция 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;
}
}
}
Как видно, я перепробовал много подходов, но, похоже, ничто не исправляет эту ошибку.Любые решения спасут мой день ...