我有一个绑定到 DateTime 对象的 DatePicker 控件:
<DatePicker SelectedDate="{Binding Path=SelectedDocu.StartDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
我有时会先启动SelectedDocu.StartDate
,然后再通过 WPF 显示数据。其他时候,它是空的,我希望用户添加日期。
当SelectedDocu.StartDate
对象已初始化为实际的 DateTime 对象,然后通过 DatePicker 更新时,双向绑定将按预期工作(== 当用户更改日期时它会更新,调用基础资源库,我可以通过断点跟踪该流)。(这是你能想象到的最标准的、普通的 PropertyChanged 设置,我什至不会发布它。
但是,当 DateTime 对象为 null 并且 DatePicker 用于选择日期时,甚至不会调用该对象的资源库。控件显示新选择的日期,但数据绑定不会更新。
我应该补充一点,SelectedDocu.StartDate
实际上是 Object 类型;它不是一个类型化的 DateTime 实例。我不希望这是一个问题,因为拆箱在我以这种方式进行数据绑定的其他任何地方都运行良好,包括SelectedDocu.StartDate
实例化版本的选择器。
知道发生了什么吗?
更新
使用 Object 存储日期时间确实有效,并且拆箱也正常工作。我确实找到了一种方法来重现这个问题,其中 Object<->DateTime 绑定不起作用,但它是一个跨多个类的半复杂设置,具有 getter/setter。当我找到时间时,我会尝试发布一个可重现的示例 - 无论是在这个问题中还是作为新帖子。目前,我已经找到了解决此问题的方法。
WPF 中的日期选取器的选定日期使用属性
public Nullable<DateTime> SelectedDate { get; set; }
请查看 MSDN - 选定日期属性以获取更多详细信息。
有关更多详细信息,请查看 C# 可为空的日期时间。
希望它能回答你的问题。
请确保 INotifyPropertyChanged 接口已在 DateTime 属性所在的类上实现。还要确保属性的 setter 正确地调用 NotifyPropertyChanged() 方法。请参阅以下链接以了解如何实现该接口:
https://msdn.microsoft.com/en-us/library/ms743695(v=vs.110).aspx
如果这没有帮助,请告诉我。
试试这个同志:D
public DateTime DateStarted
{
get
{
//SET
if (this.EmployeeJobAssignments == null)
this.EmployeeJobAssignments = new EmployeeJobAssignments();
return this.EmployeeJobAssignments.DateStarted;
}
set { this.EmployeeJobAssignments.DateStarted = value;
base.RaisePropertyChanged("DateStarted");
}
}
或者尝试使用MVVM将其设置为参数的混合代码隐藏 构造函数类
private ListBox listBox
public MyClassViewModel(ListBox listBox)
{
this.listBox = listBox
}
public void MyMethod(){
DateTime selectedDate = this.listBox.SelectedDate;
}