C# 文本框的自定义日期格式
相关的: 我有三个C# 文本框的自定义日期格式,c#,wpf,string-formatting,date-formatting,C#,Wpf,String Formatting,Date Formatting,相关的: 我有三个文本框,它们都应该用同一个日期绑定在一起。其中两个具有正常的字符串格式。第三种格式的具体格式为yyy,jjj/HHmmss。我不知道如何将此文本框绑定到我的自定义格式,如果我更改其中的任何日期值,其他文本框将更新,反之亦然 private DateTime _dateInViewModel; public DateTime DateInViewModel { get { return _dateInViewModel; } set { _
文本框
,它们都应该用同一个日期绑定在一起。其中两个具有正常的字符串格式。第三种格式的具体格式为yyy,jjj/HHmmss
。我不知道如何将此文本框
绑定到我的自定义格式,如果我更改其中的任何日期值,其他文本框
将更新,反之亦然
private DateTime _dateInViewModel;
public DateTime DateInViewModel
{
get { return _dateInViewModel; }
set
{
_dateInViewModel = value;
NotifyPropertyChanged("DateInViewModel");
}
}
<TextBox Name="SDate1" Text="{Binding DateInViewModel, StringFormat='MM/dd/yyyy'}" />
<TextBox Name="SDate2" Text="{Binding DateInViewModel}" />
<TextBox Name="STime1" Text="{Binding DateInViewModel, StringFormat='hh:mm:ss'}" />
现在,只有SDate1
和STime1
正确地相互绑定,并在另一个发生更改时更新
我做了一个转换器。当SDate1
和STime1
发生更改时,它会正确更新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;
}
您展示的是试图从部分构造字符串,而不是实现自定义格式。如果您可以创建返回所需内容的格式字符串,您可以将其放入bindingWait,这样我就可以将上面的
string.format
放入xaml??我不认为我可以将DateTime
的方法,如.Year、
等放在xaml中。不,您使用字符串所做的事情。Format实际上是从3个不同的值创建一个字符串。我发现问题是DateOfYear,这意味着您无法创建这样的格式字符串。正如其他人回答的那样,如果您希望解析文本框数据并更新ViewModel,则需要ConvertBack方法谢谢。实际上,在另一个类中有一个方法进行了转换。刚贴好,现在好像可以用了。非常感谢。
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;
}