C# WPF-具有xpath绑定的转换器获取截断的值
我有一个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
<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));
}