2010-07-27 4 views
2

juste du code ...: La question est au fond.WPF/MVVM: Comportement étrange des boutons wpf avec des commandes désactivant

XAML:

<StackPanel Orientation="Horizontal"> 
      <Button Content="Start" Command="{Binding FirstDateCommand}" /> 
      <Button Content="Back" Command="{Binding PreviousDateCommand}" /> 
      <DatePicker SelectedDate="{Binding SelectedDate}" DisplayDateStart="{Binding MinDate}" DisplayDateEnd="{Binding MaxDate}" /> 
      <Button Content="Forward" Command="{Binding NextDateCommand}" /> 
      <Button Content="End" Command="{Binding LastDateCommand}" /> 
     </StackPanel> 

ViewModel:

public class LessonPlannerViewModel : ViewModelBase 
    {  
     private ILessonPlannerRepository _lessonplannerRepo;  

     private ObservableCollection<LessonDay> _lessons; 

     private RelayCommand _firstDateCommand; 
     private RelayCommand _lastDateCommand; 
     private RelayCommand _nextDateCommand; 
     private RelayCommand _previousDateCommand; 

     public LessonPlannerViewModel() 
     { 
      _lessonplannerRepo = new LessonPlannerRepository(); 

      MinDate = DateTime.Now.AddDays(-2); 
      MaxDate = DateTime.Now.AddDays(2); 

      SelectedDate = DateTime.Now;     
     } 

     public RelayCommand FirstDateCommand 
     { 
      get { return _firstDateCommand ?? (_firstDateCommand = new RelayCommand(() => MoveFirstDate(),() => CanMoveFirstDate())); } 
     } 

     public RelayCommand LastDateCommand 
     { 
      get { return _lastDateCommand ?? (_lastDateCommand = new RelayCommand(() => MoveLastDate(),() => CanMoveLastDate())); } 
     } 

     public RelayCommand PreviousDateCommand 
     { 
      get { return _previousDateCommand ?? (_previousDateCommand = new RelayCommand(() => MovePreviousDate(),() => CanMovePreviousDate())); } 
     } 

     public RelayCommand NextDateCommand 
     { 
      get { return _nextDateCommand ?? (_nextDateCommand = new RelayCommand(() => MoveNextDate(),() => CanMoveNextDate())); } 
     } 

     private void MoveFirstDate() 
     { 
      SelectedDate = MinDate; 
      Lessons = _lessonplannerRepo.GetLessonDayByDate(SelectedDate); 
     } 

     private void MoveLastDate() 
     { 
      SelectedDate = MaxDate; 
      Lessons = _lessonplannerRepo.GetLessonDayByDate(SelectedDate); 
     } 

     private void MoveNextDate() 
     { 
      SelectedDate = SelectedDate.AddDays(1); 
      Lessons = _lessonplannerRepo.GetLessonDayByDate(SelectedDate); 
     } 

     private void MovePreviousDate() 
     { 
      SelectedDate = SelectedDate.AddDays(-1); 
      Lessons = _lessonplannerRepo.GetLessonDayByDate(SelectedDate); 
     } 

     private bool CanMoveFirstDate() 
     { 
      return SelectedDate != MinDate; 
     } 

     private bool CanMoveLastDate() 
     { 
      return SelectedDate != MaxDate; 
     } 

     private bool CanMoveNextDate() 
     { 
      return SelectedDate < MaxDate; 
     } 

     private bool CanMovePreviousDate() 
     { 
      return SelectedDate > MinDate; 
     } 

     private DateTime _selectedDate; 
     public DateTime SelectedDate 
     { 
      get { return _selectedDate; } 
      set 
      { 
       if (_selectedDate == value) 
        return; 

       _selectedDate = value; 
       this.RaisePropertyChanged("SelectedDate"); 
       //Lessons = _lessonplannerRepo.GetLessonDayByDate(SelectedDate); 
      } 
     } 

     public DateTime MinDate { get; set; } 

     public DateTime MaxDate { get; set; }   

     public ObservableCollection<LessonDay> Lessons 
     { 
      get { return _lessons; } 
      set 
      { 
       _lessons = value; 
       this.RaisePropertyChanged("Lessons"); 
      } 
     } 
... 

Quand je choisis dans la DatePicker une date qui est égale à MinDate retourne ensuite PreviousDateCommand CanExecute = false; t chapeaux ok et fonctionne comme prévu.

Mais pourquoi LastDateCommand ne renvoie pas CanExecute = false aussi?

logique Mon CanExecute fonctionne comme prévu, quand je presse la PreviousDateButtonau lieu choisir la date via datepicker.

Qu'est-ce que je me trompe?

MISE À JOUR:

Je n'ai pas eu de doute que ma logique est mal, mais ... J'ai essayé certaines choses et avec ce code

ce qui est vraiment bizarre. J'ai changé maintenant la logique de la méthode LastDate et PreviousDate CanExecute et les deux boutons fonctionnent maintenant en changeant le datepicker.

private bool CanMoveFirstDate() 
{ 
    Debug.WriteLine("SelectedDate FirstDate: " + SelectedDate); 
    return SelectedDate > MinDate; 
} 

private bool CanMovePreviousDate() 
{ 
    Debug.WriteLine("SelectedDate PreviousDate: " + SelectedDate); 
    return SelectedDate > MinDate; 
} 

Est-ce que quelqu'un sait comment faire le travail bouton NextDate + LASTDATE obtient la solution! : P

MISE À JOUR 2:

sont Manchettes mais peut-être powerfull difficile à contrôler ...

J'ai fait quelques merdes de la logique à nouveau et il semble maintenant travailler:

 private bool CanMoveNextDate() 
     { 
      Debug.WriteLine("SelectedDate NextDate: " + SelectedDate); 
      return SelectedDate.AddDays(1) < MaxDate; 
     } 

     private bool CanMoveLastDate() 
     { 
      Debug.WriteLine("SelectedDate LastDate: " + SelectedDate); 
      return SelectedDate.AddDays(1) < MaxDate; 
     } 

Si quelqu'un peut expliquer cette logique étrange, ce serait bien, je pense que la cause réside dans la liaison de la datepicker et les commandes et quelle liaison est mise à jour en premier ou est appelé etc ...

+0

Je ne suis pas sûr de comprendre la question, vous semblez enregistrer que lorsque la date sélectionnée == MinDate, PreviousDateCommand.CanExecute() renvoie false et LastDateCommand.CanExecute() renvoie true, ce qui sonne bien. Quel est le problème, est-ce un comportement différent selon que la date est choisie en utilisant le DatePicker ou les boutons? –

+0

"... est-ce un comportement différent selon que la date est sélectionnée avec le DatePicker ou les boutons?" OUI, il est différent à l'exception de la commande PreviousDateCommand, qui fonctionne en choisissant la datepicker. – msfanboy

+0

@msfanboy: Si LastDateCommand crée le problème, vous devez vérifier le résultat avec LastDateButton et non avec PreviousDateButton qui fonctionne déjà correctement. Malgré cela, le problème semble étrange. Que dit le débogueur? – Amsakanna

Répondre

2

tststs ...c'est vraiment une leçon pour moi:

Au lieu de mettre c'est le constructeur de viewmodel:

MinDate = DateTime.Now.AddDays(-2); 
MaxDate = DateTime.Now.AddDays(2); 

mettre ceci:

MinDate = DateTime.Parse("28.07.2010 00:00:00"); 
MaxDate = DateTime.Parse("01.08.2010 00:00:00"); 

parce SelectedDate est toujours formaté comme ceci:

dd.MM.yyyy 00:00:00 

Je tiens à dire Microsoft merci pour leurs excellents outils de débogage dans VS 2010 =>

http://img833.imageshack.us/img833/5912/cryforariver.png

et je l'ai déjà maudit le système de fixation WPF: P un dieu d'erreur utilisateur sacrément aller maintenant et je me gifler

mérite! mais les points sont à moi: P

Questions connexes