DataGrid DateTime IValueConverter,仅编辑时间,保留日期

问题描述 投票:0回答:1

我想分别在两列中显示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>
c# wpf xaml datetime ivalueconverter
1个回答
0
投票

如果你不想像@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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.