pfi*_*rno 2 c# wpf string-formatting date-formatting
相关:将3个文本框绑定在一起; 相同的DateTime格式不同
我有三个textboxes,所有人都应该在同一个日期绑定在一起.其中两个具有正常的字符串格式.第三个具有特定格式yyyy,jjj/HHmmss.我无法弄清楚如何将其绑定textbox到我拥有的自定义格式,并且如果我更改其中的任何日期值,那么另一个textboxes将更新,反之亦然.
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'}" />
Run Code Online (Sandbox Code Playgroud)
自定义格式可以像:
format = String.Format("{0},{1}/{2}",
DateInViewModel.Year,
DateInViewModel.DayOfYear.ToString("d3"),
DateInViewModel.ToString("HHmmss"));
Run Code Online (Sandbox Code Playgroud)
现在,只有SDate1和STime1当其它改变相互结合的正确和更新.
我做了一个转换器.它正确地更新SDate2时SDate1和STime1改变,但编辑时不起作用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
}
Run Code Online (Sandbox Code Playgroud)
您需要在转换器中设置转换回.这只是一个示例,但您需要将值解析回原始源,以便可以更新其他绑定.
因为您的格式是{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;
}
Run Code Online (Sandbox Code Playgroud)