просто код ...: Вопрос внизу.
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");
}
}
...
Когда я выбираю в DatePicker дату, равную MinDate, тогда PreviousDateCommand возвращает CanExecute = false;t Шляпки в порядке и работают как положено .
Но почему LastDateCommand тоже не возвращает CanExecute = false?
Моя логика CanExecute работает должным образом, когда я нажимаю PreviousDateButton вместо выбора даты с помощью datepicker .
Что я делаю не так?
ОБНОВЛЕНИЕ :
У меня не было никаких сомнений в том, что моя логика неверна, но ... Я попробовал кое-что, и с этим кодом
это действительно странно.Теперь я изменил логику метода CanExecute LastDate и PreviousDate, и теперь обе кнопки работают, изменяя указатель даты.
private bool CanMoveFirstDate()
{
Debug.WriteLine("SelectedDate FirstDate: " + SelectedDate);
return SelectedDate > MinDate;
}
private bool CanMovePreviousDate()
{
Debug.WriteLine("SelectedDate PreviousDate: " + SelectedDate);
return SelectedDate > MinDate;
}
Кто-то знает, как заставить работать кнопку NextDate + LastDate, чтобы получить решение!: P
ОБНОВЛЕНИЕ 2:
Привязки мощные, но, возможно, их трудно контролировать ...
Я снова сделал немного сумасшедшую логику, и теперь этоКажется, работает:
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;
}
Если кто-то может объяснить эту странную логику, это было бы неплохо, я думаю, причина кроется в привязке указателя даты и команд, и какая привязка получаетсначала обновляется или называется и т. д ...