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

C# WPF-具有xpath绑定的转换器获取截断的值,c#,wpf,xpath,converter,C#,Wpf,Xpath,Converter,我有一个WPF文本框,带有字符串日期的xpath绑定: <TextBox Grid.Column="3" Grid.Row="1" Margin="0 0 0 2" IsReadOnly="True" Text="{Binding XPath='ns:data_creazione/text()'}" /> 我需要根据机器文化信息将日期格式化为“可读”格式,还需要将时间“转换”为本地时区,因此我制作了一个转换器: using System; using System.Glo

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

<TextBox Grid.Column="3" Grid.Row="1" Margin="0 0 0 2" IsReadOnly="True" 
    Text="{Binding XPath='ns:data_creazione/text()'}" />
我需要根据机器文化信息将日期格式化为“可读”格式,还需要将时间“转换”为本地时区,因此我制作了一个转换器:

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中,我添加了静态资源声明,并对文本框进行了如下修改:

2016-06-13 22:00:00.000+0000
<TextBox Grid.Column="3" Grid.Row="1" Margin="0 0 0 2" IsReadOnly="True" 
    Text="{Binding XPath='ns:data_creazione/text()', 
    Converter={StaticResource DateTimeToLocalTimezoneConverter}}" />
怎么了?
任何帮助都将不胜感激。

您应该能够将
DateTime.TryParse
方法与
CultureInfo.InvariantCulture
datetimestyle.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));
}

看起来像是在解析你给它的字符串。当你说“我能看到那个值被截断了”时,你能更具体地表达你的意思吗?确切的截断值是多少?哪一行截断了它?如果不知道传入的参数,很难说方法为什么会失败。value参数是
2017-02-27T17:06:06
,但是,正如我在帖子开头提到的那样,真正的价值是
2016-06-13 22:00:00.000+0000
,看起来你在告诉它期待
…HH:mm:ss.fffzzz
,并且只给它
…HH:mm:ss
。您是否无法确定它被截断的位置或方式?或者“real value”是指运行时
value
参数到
Convert()
的实际字符串值以外的值吗?在XML中,我有
2016-06-13 22:00:00.000+0000
,没有使用转换器,我看到了这一点。当我使用转换器时,
Convert()
中的
value
参数的字符串值是
2017-02-27T17:06:06
,但我不知道它为什么会被截断。TryParse似乎可以工作,但解析不正确。xml中的日期字符串是
2016-06-13 22:00:00.000+0000
,但我在解析后得到
14/06/2016 00:00:00
。尝试使用DateTimeStyles.AdjustToUniversal样式而不是DateTimeStyles.None。我编辑了我的答案。现在它似乎可以使用DateTimeStyles。无,我可以通过时区调整看到正确的日期/时间。非常感谢。
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));
}