【问题标题】:DataGrid DateTime IValueConverter, edit time only, preserve dateDataGrid DateTime IValueConverter,仅编辑时间,保留日期
【发布时间】:2023-04-07 18:47:01
【问题描述】:

我想在两列中分别显示日期时间和时间。使用输入“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>

【问题讨论】:

  • 在我看来你应该保持私有 DateTime _myDateTime;并为 VM 提供两个属性,公共字符串/DateTime Date{get;set;} 和公共字符串/DateTime Time{get;set;},这样您就不需要转换器并且可以更好地管理时间/日期.. .

标签: c# wpf xaml datetime ivalueconverter


【解决方案1】:

如果您不想像@Nawed Nabi Zada 所说的那样将时间和日期拆分为两个属性,我还有另一个解决方案,它有点老套。 您可以将原始日期保存在转换器中。请注意,这只适用于仅在一处使用转换器的情况。

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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2019-07-28
    相关资源
    最近更新 更多