IValueConverter将4位int转换为时间(日期)

时间:2017-05-06 10:41:10

标签: c# wpf

我正在尝试使用Converter撰写IValueConverter

我要做的是允许用户在DataGRid中输入1到4位数的数字,并以24小时时间格式表示时间。

这是我到目前为止的代码,当在虚拟方法(不是转换器)中使用虚拟值进行测试时,它会返回所需的日期+时间。

public class ReturnDateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        DateTime result = new DateTime();
        var param = parameter as string;
        if (string.IsNullOrEmpty(param) || value == null) return result;
        if (param.Length > 4) return result;
        var date = DateTime.Parse(value.ToString());
        var pad = param.PadLeft(4, '0');
        string[] t = pad.Select(s => s.ToString()).ToArray();
        var newTime = new TimeSpan(int.Parse(t[0] + t[1]), int.Parse(t[2] + t[3]), 0);
        if (newTime.Minutes == 1) return result;
        var timestring = date.Date + newTime;
        result = timestring;
        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

和XAML,

<UserControl.Resources>        
    <local:ReturnDateConverter x:Key="ReturnDateConverter"/>
</UserControl.Resources>


<DataGridTemplateColumn Header="退勤" Width="90" SortMemberPath="Date_Data">
     <DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
              <TextBlock Text="{Binding Path=TimeDataTwo, StringFormat={}{0:hh:mm}, UpdateSourceTrigger=LostFocus}" />
          </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
           <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <xctk:DateTimeUpDown Minimum="{Binding Path=TimeDataTwo}"
                                         Maximum="{Binding Path=TimeDataTwo,
                                         Converter={StaticResource ReturnDateConverter},
                                         ConverterParameter=1}" 
                                         Format="ShortTime" 
                                         Value="{Binding Path=TimeDataTwo,
                                         StringFormat={}{0:hh:mm}, 
                                         UpdateSourceTrigger=LostFocus}" />
               </DataTemplate>
          </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

转换器触发但是,我似乎总是得到结果minvalue的{​​{1}},并且由于没有值存在,它会退出此行DataTime上的代码。

任何帮助都将不胜感激。

编辑:

由于已经有答案而没有更改问题,我取出了if (newTime.Minutes == 1) return result;,现在我只在这里获得ConverterParameter=1null ???

1 个答案:

答案 0 :(得分:1)

第一期

您将ConverterParameter=1传递给转换器并解析此版本而不是value

<强>更新

查看DateTimeUpDown提供的可能性,您可以尝试AllowTextInput并使用所需的格式字符串指定Format="Custom"

<xctk:DateTimeUpDown Format="Custom" 
                     FormatString="H:mm"
                     AllowTextInput="true" 
                     Value="{Binding Path=TimeDataTwo, StringFormat={}{0:hh:mm}, UpdateSourceTrigger=LostFocus}" />

我肯定会扔掉

Minimum="{Binding Path=TimeDataTwo}"
Maximum="{Binding Path=TimeDataTwo}"

因为将min和max设置为当前值并没有任何意义,因此无法进行任何编辑。

第二期:

如果您想要24小时格式,则需要使用HH格式图片 - hh是12小时格式。

更改

StringFormat={}{0:hh:mm}

StringFormat={}{0:HH:mm}

请参阅MSDN - Custom Date and Time Format Strings