当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; }
}
答案 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;
}
}