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

时间:2017-02-27 16:18:23

标签: c# wpf xpath converter

我有一个WPF TextBox,其xpath绑定字符串日期:

<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

我需要根据MachineInfo机器以“可读”格式格式化日期,我还需要将时间“转换”到本地时区,所以我制作了一个转换器:

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}}" />

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

2017-02-27T17:06:06

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

1 个答案:

答案 0 :(得分: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));
}