DatePicker DisplayDate绑定问题

时间:2011-12-06 09:45:12

标签: wpf mvvm .net-4.0 wpf-controls datepicker

当DatePicker在ControlTemplate中时,似乎DisplayDate无法正确绑定。

这是我通过MVVM将DisplayDate绑定到DatePicker的方法。但DatePicker不会正确显示CustomDisplayDate。它会一直显示默认的显示日期,即DateTime.Now()。

请记住,如果DatePicker不在ControlTemplate中,此代码可以正常工作。

有关如何解决此问题的任何建议?

XAML代码:

<Window.Resources>
    <ControlTemplate x:Key="DateField">
        <StackPanel>
            <TextBlock Text="Custom Display Date:" />
            <TextBlock Text="{Binding CustomDisplayDate}"/>
            <DatePicker 
                SelectedDate="{Binding CustomSelectedDate}" 
                DisplayDate="{Binding CustomDisplayDate}" 
                HorizontalAlignment="Left" 
                VerticalAlignment="Top"/>
        </StackPanel>
    </ControlTemplate>
</Window.Resources>
<Grid>
    <ContentControl Template="{StaticResource DateField}" />
</Grid>

和ViewModel:

public class MainWindowViewModel
{
  public MainWindowViewModel()
  {
     CustomDisplayDate = DateTime.Now.AddDays(5);
  }

  public DateTime? CustomSelectedDate { get; set; }
  public DateTime CustomDisplayDate { get; set; }
}

2 个答案:

答案 0 :(得分:1)

这里的第一个问题是您没有使用INotifyPropertyChanged

请查看下面链接的文章:

答案 1 :(得分:1)

我意识到这已经很老了,但我今天偶然发现了同样的问题。我不确定为什么会发生这种情况,而且我很确定我的绑定设置正确。

我找到了一个解决方案,至少在我的情况下。我将PreparingCellForEdit事件连接到我的ViewModel。该方法偷看检查列以确定编辑单元格是否属于正确的日期选择列,我还检查了它绑定的日期是否为空,这告诉我它是一个新行。然后我可以抓住datepicker并从代码中设置DisplayDate。

private void OnPreparingCellForEdit(DataGridPreparingCellForEditEventArgs e)
{
    DataGridColumn sourceColumn = e.Column;
    DataGridRow sourceRow = e.Row;
    ScheduleDate data = (ScheduleDate) sourceRow.DataContext;

    if (string.Equals(sourceColumn.Header.ToString(), "Work Date") && !data.WorkDate.HasValue)
    {
        var dp = e.EditingElement.GetVisualChild<DatePicker>() as DatePicker;
        dp.DisplayDate = this.WorkDate;
    }
}