在类中转换DateTime字符串以进行数据绑定

时间:2014-04-19 23:49:46

标签: c# wpf json datetime

我尝试将JSON Feed绑定到类以在XAML表中显示。所有这些都有效。但是,我遇到的一个问题是将DateTime值(以字符串形式输入)转换为不同的格式。

例如,JSON将其提供为:" 2014-04-20T02:57:00Z"。我想将其转换为"HH:mm"格式。

public String ArrivalTime
{
    get
    {

        DateTime dt = DateTime.Parse(ArrivalTime);
        string test =  String.Format("{HH:mm}", dt);
        return test;
    }
    set
    {

    }
}

我不太熟悉访问者,我很确定我做错了,但我希望在正确的轨道上?如何将传入的DateTime字符串动态转换为新的DateTime格式化字符串?

提前致谢!

2 个答案:

答案 0 :(得分:1)

“WPF”方式是让视图转换它。您可以使用IValueConverter接口将数据转换为您希望如何显示它。

您需要将逻辑输入到日期时间应该是多少。这是我的猜测。我不知道你怎么能转换回来只是你有时间而不是整个约会时间。此外,MarkupExtension不是必需的,它只是一个不错的选择。有关详细信息,请参阅http://wpftutorial.net/ValueConverters.html

public class JSONDateToDate : MarkupExtension,  IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var jSONDate = parameter as string;
        if (!string.IsNullOrEmpty(jSONDate))
        {
            DateTime dt;
            if DateTime.TryParse(jSONDate, out dt)
            {
                return dt;
            }
        }
        // If didn't pass in string or TryParse failed return back empty datetime
        return new DateTime();
    }

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

    // Not needed just nice
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

在你的XAML中,你会像

一样使用它
<TextBox Name="tbxArrivalTime" Text="{Binding Path=ArrivalTime, StringFormat=" \{0:HH:mm\}". Converter={x:JSONDateToDate } />

只是一句警告我没有测试所有这些代码,它可能在XAML中有一些小问题,因为如果没有实际连接所有内容,很难打字。

根据获取日期字符串而不是数字来更新我的答案。您可以在IValueConverter中返回格式化的字符串,也可以返回日期时间。如果返回日期时间,则使用stringformat将值格式化为字符串。如果你有很多地方的确切格式我会把它放在值转换器中,否则我会让我的值转换器返回一个日期时间,因为我可能会更多地重用它。

答案 1 :(得分:0)

如果你的数据应该是一个日期/时间,你应该确保它是。只需在您的Feed的反序列化中添加另一个步骤来更正它,然后它只是一个演示问题:

<TextBox Name="tbxArrivalTime" Text="{Binding Path=ArrivalTime, Format=\{0:HH:mm\}}" />