WPF / MVVM: странное поведение кнопок wpf с отключением команд - PullRequest
2 голосов
/ 28 июля 2010

просто код ...: Вопрос внизу.

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;
        }  

Если кто-то может объяснить эту странную логику, это было бы неплохо, я думаю, причина кроется в привязке указателя даты и команд, и какая привязка получаетсначала обновляется или называется и т. д ...

1 Ответ

2 голосов
/ 30 июля 2010

ццц ... это действительно урок для меня:

Вместо этого это конструктор viewmodel:

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

поставить это:

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

потому что SelectedDate всегда форматируется так:

dd.MM.yyyy 00:00:00

Я хочу сказать, что Microsoft благодарит вас за отличные инструменты отладки в VS 2010 =>

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

и я уже проклял систему привязки wpf: Черт возьми, ошибка пользователя, иди и дай мне пощечину

заслуживают этого! но очки мои: P

...