WPF - 具有 xpath 绑定的转换器获取值被截断

WPF - Converter with xpath binding get value truncated

我有一个带有字符串日期 xpath 绑定的 WPF 文本框:

<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 将日期格式化为 "readable" 格式,我还需要时间 "converted" 到本地时区,所以我做了一个转换器:

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:

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

运行 代码,在我的 window 中,我看到一个空的文本框。在 Convert 方法中添加一个断点我可以看到该值被截断并且 T​​ryParseExact return 在解析日期时为 false。 在值参数中我可以看到这个:

2017-02-27T17:06:06

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

您应该能够将 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));
}