2017-02-27 38 views
0

我有一个WPF的TextBox使用XPath字符串日期的结合:WPF - 转换器使用XPath结合GET值截断

<TextBox Grid.Column="3" Grid.Row="1" Margin="0 0 0 2" IsReadOnly="True" 
    Text="{Binding XPath='ns:data_creazione/text()'}" /> 

当应用程序运行时我看到这样一个值:

2016-06-13 22:00:00.000+0000 

我需要有日期在“可读的”格式进行格式化,根据机器的CultureInfo和我还需要时间“转换”为本地时区,所以我提出的转换器:

using System; 
using System.Globalization; 

namespace MyNamespace.Converter.General 
{ 
    class DateTimeToLocalTimezoneConverter : System.Windows.Data.IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      string dateFormat = "yyyy-MM-dd'T'HH:mm:ss.fffzzz"; 

      CultureInfo currentCulture = CultureInfo.CurrentCulture; 
      var date = value as string; 

      DateTime valueDate; 

      if (DateTime.TryParseExact(date, dateFormat, currentCulture, DateTimeStyles.None, out valueDate)) 
      { 
       return String.Format("{0:f}", valueDate.ToString(currentCulture)); 
      } 
      return ""; 
     } 

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

在XAML我已经添加静态资源声明,我已经修改了文本框是这样的:

<TextBox Grid.Column="3" Grid.Row="1" Margin="0 0 0 2" IsReadOnly="True" 
    Text="{Binding XPath='ns:data_creazione/text()', 
    Converter={StaticResource DateTimeToLocalTimezoneConverter}}" /> 

运行代码,在我的窗口我看到一个空文本框。在Convert方法中添加一个断点我可以看到该值被截断,TryParseExact在解析日期时返回false。 在价值参数我可以看到这个:

2017-02-27T17:06:06 

怎么了? 任何帮助,将不胜感激。

+1

貌似['DateTime.TryParseExact'失败(HTTPS: //msdn.microsoft.com/en-us/library/system.datetime.tryparseexact%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396)来解析你给它的字符串。当你说*“我可以看到价值被截断”*,你能更准确地沟通你的意思吗?什么是确切的截断值?哪一行截断它?很难说为什么一个方法在不知道传入参数的情况下失败了。 –

+0

值参数为'2017-02-27T17:06:06',但实际值为'2016-06-13 22:00:00:00.000+ 0000',正如我在文章开头提到的那样 –

+0

看起来你正在告诉它期望'...... HH:mm:ss.fffzzz'并且只给它...... ...... HH:mm:ss'。你无法确定它在哪里或如何被截断?或者,“实际值”是指在运行时对'Convert()'的'value'参数的实际字符串值以外的内容吗? –

回答

0

您应该能够使用DateTime.TryParse方法与CultureInfo.InvariantCultureDateTimeStyles.AdjustToUniversal

if (DateTime.TryParse(date, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out valueDate)) 
{ 
    return String.Format("{0:f}", valueDate.ToString(currentCulture)); 
} 

工作示例代码:

CultureInfo currentCulture = CultureInfo.CurrentCulture; 
string date = "2016-06-13 22:00:00.000+0000"; 
DateTime valueDate; 
if (DateTime.TryParse(date, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out valueDate)) 
{ 
    string s = String.Format("{0:f}", valueDate.ToString(currentCulture)); 
} 
+0

TryParse似乎工作,但解析不正确。 xml中的日期字符串为'2016-06-13 22:00:00.000 + 0000',但解析后我得到了'14/06/2016 00:00:00'。 –

+1

尝试使用DateTimeStyles.AdjustToUniversal样式而不是DateTimeStyles.None。我编辑了我的答案。 – mm8

+0

现在它似乎使用DateTimeStyles工作。 没有,我可以看到正确的日期/时间调整。 谢谢。 –