我想分别在两列中显示DateTime作为日期和时间。使用输入“HHmmss”更新时间列会更新时间,但会将日期重置为当前日期。如何保存日期?
public class TimeToStringConverter : IValueConverter
{
public string Format { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Format = "HH:mm:ss";
DateTime DateTimeValue = (DateTime)value;
return DateTimeValue.ToString(Format);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
string strValue = value.ToString();
DateTime DateTimeValue;
string format = "HHmmss";
if (value.ToString().Length == 4)
format = "HHmm";
var res1 = DateTime.TryParseExact(strValue, format, null, DateTimeStyles.None, out DateTimeValue);
if (res1)
return DateTimeValue;
return value;
}
}
xaml:
<UserControl.Resources>
<valrule:TimeToStringConverter x:Key="timeConverter"/>
</UserControl.Resources>
<DataGridTextColumn Header="Time" MinWidth="50">
<DataGridTextColumn.Binding>
<Binding Path="Time" StringFormat="HH:mm:ss" UpdateSourceTrigger="Default"
Converter="{StaticResource timeConverter}" >
<Binding.ValidationRules>
<valrule:DateValidation/>
</Binding.ValidationRules>
</Binding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
如果你不想像@Nawed Nabi Zada所说的那样在两个属性中分割时间和日期,我还有另外一个有点hacky的解决方案。您可以将原始日期保存在转换器中。请注意,这仅适用于仅在一个位置使用转换器的情况。
public class TimeToStringConverter : IValueConverter
{
private DateTime _originaldate;
public string Format { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Format = "HH:mm:ss";
DateTime DateTimeValue = (DateTime)value;
_originaldate = (DateTime)value;
return DateTimeValue.ToString(Format);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
string strValue = value.ToString();
DateTime DateTimeValue;
string format = "HH:mm:ss";
if (value.ToString().Length == 4) format = "HH:mm";
var res1 = DateTime.TryParseExact(strValue, format, null, DateTimeStyles.None, out DateTimeValue);
if (res1)
{
DateTimeValue = _originaldate.Date + DateTimeValue.TimeOfDay;
return DateTimeValue;
}
return value;
}
}