【问题标题】:DateTimePicker Calendar defaults to last Month/Year selectedDateTimePicker 日历默认为所选的上个月/年
【发布时间】:2012-05-18 23:48:34
【问题描述】:

DateTime 是什么时候?我的 DateTimePicker 控件的源更改为 null,我想选择另一个日期,日历下拉菜单默认为所选的最后一个月和年份。

我将 DateTimePicker 用于 DOB,因此月份和年份会有很大差异,我宁愿在数据源更改为 null 时将日历重置为当前月份和年份。 WPFToolkit 中的 DateTimePicker 可以做到这一点,但我不想要微调器或它附带的时间选择,也找不到隐藏它们的方法。

我正在使用 MVVM 设计模式并希望避免立即执行代码隐藏。

视图中的 XAML:

<DatePicker Height="25" HorizontalAlignment="Left" Margin="53,47,0,0" 
    Name="dpEventDate" VerticalAlignment="Top" Width="115" 
    SelectedDate="{Binding EventItem.BirthDate, Mode=TwoWay, 
    UpdateSourceTrigger=PropertyChanged}" />

视图模型中的C#:(事件是我在模型中制作的一个类)

private Event _eventItem;

public event PropertyChangedEventHandler PropertyChanged;
public RelayCommand CreateCommand { get; private set; }

public Event EventItem
{
    get { return _eventItem; }
    set { _eventItem = value; OnPropertyChanged("EventItem"); }
}

public MainViewModel()
{
    EventItem = new Event();
    CreateCommand = new RelayCommand(CreateEvent);
}

protected void OnPropertyChanged(string name)
{
    PropertyChangedEventHandler handler = PropertyChanged;

    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(name));
    }
}

如果我可以提供更多细节来帮助您帮助我,请告诉我。

【问题讨论】:

  • 您可以重新定义 WPF 时间选择器上的控件模板并删除您不想要的位 - 在 blend 中最容易做到,您有 blend 吗?
  • 为什么不创建一个新的 C# DateTime 属性并绑定到 that。订阅对原始日期的更改,并对其进行镜像,除非原始日期更改为空,在这种情况下将其设置为 DateTime.Now 或其他任何内容
  • 感谢 cmets!我在工作中使用了 Blend,但从未使用过它,甚至没有真正理解它的作用,所以感谢您推荐它,Charleh!我仍在研究该模板,但尝试了 Adam 的建议,并且成功了。我稍后会发布代码。

标签: c# wpf xaml mvvm datetimepicker


【解决方案1】:

根据 Adam 的建议,这里是视图模型中帮助我重置 DateTimePicker 的日历显示的代码:

private Event _eventItem;
private DateTime? _viewDate;

public event PropertyChangedEventHandler PropertyChanged;
public RelayCommand CreateCommand { get; private set; }

public Event EventItem
{
    get { return _eventItem; }
    set { _eventItem = value; OnPropertyChanged("EventItem"); }
}

// Decoy DateTime property
public DateTime? ViewDate
{
    get { return _viewDate; }
    set
    { 
        _viewDate = value;
        EventItem.EventDate = _viewDate; // Update the source

        OnPropertyChanged("ViewDate");
    }
}

public MainViewModel()
{
    EventItem = new Event();
    CreateCommand = new RelayCommand(CreateEvent);
}

private void CreateEvent()
{
    ViewDate = DateTime.Today; // Important for resetting the calendar display
    // Save input and set EventItem to new event for a clean slate
}

protected void OnPropertyChanged(string name)
{
    PropertyChangedEventHandler handler = PropertyChanged;

    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(name));
    }

    // Important if you want your DatePicker control to be empty
    if(name.Equals("ViewDate") && DateTime.Today.Equals(ViewDate))
    {
        ViewDate = null;
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多