文本框的自定义日期格式

相关:将3个文本框绑定在一起; 相同的DateTime格式不同

我有三个textboxes ,所有textboxes都应该绑定在同一个日期。 其中两个具有正常的字符串格式。 第三个具有yyyy,jjj/HHmmss的特定格式。 我无法弄清楚如何将此textbox绑定到我拥有的自定义格式,并且如果我更改其中的任何日期值,那么其他textboxes将更新,反之亦然。

 private DateTime _dateInViewModel; public DateTime DateInViewModel { get { return _dateInViewModel; } set { _dateInViewModel = value; NotifyPropertyChanged("DateInViewModel"); } }    

自定义格式可以像:

 format = String.Format("{0},{1}/{2}", DateInViewModel.Year, DateInViewModel.DayOfYear.ToString("d3"), DateInViewModel.ToString("HHmmss")); 

现在,只有SDate1STime1正确绑定,并在另一个更改时更新。

我做了一个转换器。 当SDate1STime1发生更改时,它会正确更新SDate2 ,但在编辑SDate2以更新其他SDate2时不能正常工作。

 public class DateTimeConverter : IValueConverter { #region IValueConverter Members public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value != null) { DateTime test = (DateTime)value; string date = String.Format("{0},{1}/{2}", test.Year, test.DayOfYear.ToString("d3"), test.ToString("HHmmss")); return (date); } return string.Empty; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } #endregion } 

您需要在转换器中设置转换。 这只是一个示例,但您需要将值解析回原始源,以便可以更新其他绑定。

由于您的格式为{0},{1}/{2}因此您需要将其拆分并重新构建预期日期。

 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { if (value == null) return null; string strValue = value.ToString(); if (string.IsNullOrEmpty(strValue) && targetType == typeof(DateTime?)) { return null; } else if (string.IsNullOrEmpty(strValue)) { return DateTime.MinValue; } //year,dayOfYear/Time(HHmmss) var parts = strValue.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 2) { var year = parts[0]; parts = parts[1].Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 2) { var days = parts[0]; var time = parts[1]; var date = new DateTime(int.Parse(year), 1, 1) .AddDays(int.Parse(days)) .Add(TimeSpan.Parse(time)); return date; } } DateTime resultDateTime; return DateTime.TryParse(strValue, out resultDateTime) ? resultDateTime : value; }