我有一个简单的表单,有两个DateTimePicker控件:一个用于日期,一个用于时间。事情是这两个控件应该代表一个单一的时间点。因此,我想将它们“绑定”到我的表单上的单个DateTime属性(为简单起见)。我做了以下事情:
// Start is a DateTime property on the form
_StartDate.DataBindings.Add("Value", this, "Start");
_StartTime.DataBindings.Add("Value", this, "Start");
但是进入“ValueChanged”事件会产生不同的结果......有时候我得到了我想要的东西,有时房产的更新是“缓慢的”。我认为这种分裂为两个DateTimePicker的方式相当普遍。那怎么办呢?
更新:可能存在多个问题:
答案 0 :(得分:2)
我发现自己偶尔遇到这个问题而且我使用了一种有点难看的技巧。我没有直接绑定到属性,而是在模型上创建了两个额外的属性。
//The data I want to bind to
public DateTime Something { get; set; }
//Two new properties
public DateTime SomethingDate { /*...*/ }
public DateTime SomethingTime { /*...*/ }
每个get
部分应仅返回Something
。 set
部分是您实现一点点逻辑的地方,以确保Something
始终准确反映。
public DateTime SomethingDate
{
get
{
return this.Something;
}
set
{
this.Something = value.Date.Add(this.Something.TimeOfDay);
}
}
public DateTime SomethingTime
{
get
{
return this.Something;
}
set
{
this.Something = this.Something.Date.Add(value.TimeOfDay);
}
}
现在,您的Something
属性将始终正确反映两个控件的相应日期和时间,同时仅使用我们关注的每条信息更新值。
答案 1 :(得分:1)
不幸的是,我认为您可能会发现自己正在编写一个包含两者的自定义控件,您可以将数据绑定到该控件。这就是我们解决同样问题的方法。
答案 2 :(得分:1)
您无法直接将DateTime结构成员绑定到绑定类, 要做到这一点,你必须包装一个DateTime结构并实现INotifyPropertyChanged接口的PropertyChanged事件,如下所示:
public class DateTimeWrapper : INotifyPropertyChanged
{
private DateTime _dateTime;
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged()
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs("Value"));
}
public DateTime Value
{
get { return _dateTime; }
set
{
_dateTime = value;
OnPropertyChanged();
}
}
}
之后你可以像这样使用Bindig对象:
var binding = new Binding("Value", _time, "Value", true);
binding.ControlUpdateMode = ControlUpdateMode.OnPropertyChanged;
dateTimePicker1.DataBindings.Add(binding);
答案 3 :(得分:1)
我知道这有点旧,但我使用了这里找到的解决方案:
工作正常,是无代码解决方案
答案 4 :(得分:0)
我的WinForm中有一个名为EpDayOnly的公共DateTime
属性。
然后我通过写:
myDateTimePicker.DataBindings.Add("Value", this, "EpDayOnly", false, DataSourceUpdateMode.OnPropertyChanged);
当我打开表单时,我通过编写例如
来设置datetime属性myNewForm.EpDayOnly=DateTime.Parse("5/5/2012");
,这反映在datetimepicker控件上。