2011-02-26 53 views
2

我有兩個Date拾取器 - 一個用於「From」,另一個用於「To」。如果From日期變爲大於To日期,我有要求將To date更改爲From日期 - 反之亦然。目前,如果在選擇「起始日期」後重點關注「截止日期」的文本框,則set屬性會觸發兩次,從而重置正確的日期。但是,如果我從日曆控件中選擇一個日期而不是鍵入它,它可以正常工作。使用Silverlight 4中的datepickers問題

這裏是我的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"); 

      } 
     } 
    } 

,這裏是在代碼中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

這是我的嘗試,我認爲它完成了你以後。

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"); 

     } 
    }