仅限绑定日期和仅限时间

我有2个控件:

DatePicker:仅限日期
带有TimeMask的TextBox:仅限时间

它们都链接到同一属性DateTime EffectiveDate但问题是当我更改DatePicker上的Date时,它将TimeTextBox中的Time更改回12:00。

我理解它的原因,但是最好的解决方案是让它们分开工作但是绑定到同一个属性?

我试图占用当前时间并在set属性中构建一个新的Date但总是出现溢出错误。

您可以使用值转换器来保持该值

 public class DateConverter : IValueConverter { private DateTime timePickerDate; public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { timePickerDate = ((DateTime)(value)); return value; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { if (value == null) return timePickerDate; var datePickerDate = ((DateTime)(value)); // compare relevant parts manually if (datePickerDate.Hour != timePickerDate.Hour || datePickerDate.Minute != timePickerDate.Minute || datePickerDate.Second != timePickerDate.Second) { // correct the date picker value var result = new DateTime(datePickerDate.Year, datePickerDate.Month, datePickerDate.Day, timePickerDate.Hour, timePickerDate.Minute, timePickerDate.Second); // return, because this event handler will be executed a second time return result; } return datePickerDate; } } 

并且有问题的两个控件绑定到一个属性,但让日期选择器使用转换器不覆盖时间。

         

你可以这样做:

 private DateTime _effectiveDate; ... public DateTime DateOfEffectiveDate { get { return _effectiveDate; } set { _effectiveDate = new DateTime(value.Year, value.Month, value.Day, _effectiveDate.Hour, _effectiveDate.Minute, _effectiveDate.Second); } } public DateTime TimeOfEffectiveDate { get { return _effectiveDate; } set { _effectiveDate = new DateTime(_effectiveDate.Year, _effectiveDate.Month, _effectiveDate.Day, value.Hour, value.Minute, value.Second); } } 

内置的DatePicker控件只选择没有任何特定时间的日期,所以我担心尝试在TextBox中显示所选日期的时间是没有意义的。 每次选择新日期时,DatePicker将有效清除时间部分。 这就是控件的工作原理。

那么你应该将DatePicker和TextBox绑定到两个不同的源属性,一个DateTime? 和一个TimeSpan分别。

另一种选择是使用另一个选择日期和时间的控件,例如: http : //wpftoolkit.codeplex.com/wikipage?title = DateTimePicker

捕获dateTimePicker1_ValueChanged事件,然后设置合并datetime部分的binded field value

 private void dateTimePicker1_ValueChanged(object sender, EventArgs e) { DateTime dt = dateTimePicker1.Value; int hour = Convert.ToInt32(textBox1.Text.Split(':')[0]); int minute = Convert.ToInt32(textBox1.Text.Split(':')[1]); bindedfield = new DateTime(dt.Year, dt.Month, dt.Day, hour, minute, 0); }