Wpf 日期选择器显示日期绑定问题

Wpf 日期选择器显示日期绑定问题,wpf,mvvm,.net-4.0,wpf-controls,datepicker,Wpf,Mvvm,.net 4.0,Wpf Controls,Datepicker,当日期选择器位于ControlTemplate内时,DisplayDate似乎没有正确绑定 这就是我如何通过MVVM将DisplayDate绑定到DatePicker的方法。但是日期选择器无法正确显示CustomDisplayDate。它保持显示默认的显示日期,即DateTime.Now() 请记住,如果DatePicker不在ControlTemplate中,则此代码确实有效 对如何解决这个问题有什么建议吗 XAML代码: <Window.Resources> <Co

当日期选择器位于ControlTemplate内时,DisplayDate似乎没有正确绑定

这就是我如何通过MVVM将DisplayDate绑定到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>

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

请查看以下链接的文章:


    • 我意识到这是一个相当古老的问题,但今天我偶然发现了同样的问题。我不确定为什么会发生这种情况,我相当确定我已经正确地建立了绑定

      我确实找到了工作,至少对我来说是这样。我将PreparingCellForEdit事件连接到我的ViewModel。Peek方法检查列以确定编辑单元格是否属于日期选择器的正确列,我还检查了它绑定到的日期是否为null,这告诉我它是一个新行。然后我可以抓取datepicker并根据代码设置其显示日期

      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;
          }
      }
      
      PreparingCellForedit上的私有无效(DataGridPreparingCellForEditEventArgs e)
      {
      DataGridColumn sourceColumn=e.列;
      DataGridRow sourceRow=e.行;
      ScheduleDate数据=(ScheduleDate)sourceRow.DataContext;
      if(string.Equals(sourceColumn.Header.ToString(),“工作日期”)&&!data.WorkDate.HasValue)
      {
      var dp=e.EditingElement.GetVisualChild()作为日期选择器;
      dp.DisplayDate=此.WorkDate;
      }
      }
      
      在我发布的简单示例代码中,CustomDisplayDate是在构造函数中设置的,因此不需要INotifyPropertyChanged。第一次加载后,属性未更改。请注意,如果我在ControlTemplate之外创建DatePicker,则此代码确实有效。@DannyPham Yep。您是对的,在您的代码示例中,它不会更改视图。如果没有
      INotifyPropertyChanged
      ,它就无法知道何时对ViewModel属性进行了任何更改。亲爱的anatoliiG,感谢您对INotifyPropertyChanged的建议。但在这个示例中,这不是一个问题。如果您尝试示例代码,您将看到,就在DatePicker上方,CustomDisplayDate显示得很好。因此,视图确实知道+5天。这里的问题是,当日期选择器位于ControlTemplate内时,它将无法在日历中正确显示DisplayDate。当通过ContentControl访问DatePicker时,DisplayDate绑定似乎在某处丢失。@DannyPham尝试在模板中添加绑定的
      Source
      属性。我不确定模板上的Source属性是什么。。。你能让我参考一些代码示例吗?
      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;
          }
      }