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