代码之家  ›  专栏  ›  技术社区  ›  msfanboy

wpf/mvvm:命令禁用的wpf按钮的奇怪行为

  •  2
  • msfanboy  · 技术社区  · 16 年前

    只是一些代码…: 问题在底部。

    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>
    

    视图模型 :

    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的日期时,previouusdate命令返回canexecute=false;t 帽子可以,按预期工作 .

    但是为什么lastdatecommand 不返回canexecute=false吗?

    当我按下 “上一个日期”按钮 相反 通过选择日期 数据记录器 .

    我做错什么了?

    更新 :

    我没有怀疑我的逻辑是错误的,但是…我试过一些东西,用这个密码

    这真的很奇怪。我现在更改了lastdate和previousdate canexecute方法的逻辑,两个按钮现在都可以更改日期选择器。

    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 回复  |  直到 16 年前
        1
  •  2
  •   msfanboy    16 年前

    TSTSTS…这对我来说真是一个教训:

    视图模型构造器不是这样放置的:

    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
    

    我想说的是,微软感谢您在Vs2010中的出色调试工具。

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

    我已经诅咒了wpf绑定系统:p一个该死的用户错误,现在去扇我一巴掌。

    值得!但问题是我的:p