【问题标题】:Present string different in View than what it's set in ViewModel在 View 中显示的字符串与在 ViewModel 中设置的字符串不同
【发布时间】:2015-06-05 08:24:22
【问题描述】:

我在 Windows Phone 8 w/SQLite 上开展一个项目,我一直在处理日期和时间,最近我不得不开始使用一些聚合函数来选择一些数据,但这些只能如果日期时间字符串以某种方式格式化(SQLite DateTime),那么我必须更改这些值的格式,以便从聚合查询中获得我期望的结果。

我的问题是,在向用户展示数据时,这些格式并不是最吸引人的。例如,在使用聚合函数之前,我将持续时间显示为“23h 32m 21s”(h'h 'm'm 's's')或日期显示为 2015 年 3 月 31 日星期二(dddd dd MMMM yyyy),但我必须更改这些是 SQLite 用于执行聚合查询的格式,因此它们现在读取 00:00:00 的持续时间和 2015-03-31 的日期等。

有没有什么方法可以在向用户呈现数据时更改格式,而不管它是如何格式化并插入到 ViewModel/C# 中的数据库中的?我尝试使用 StringFormatConverter 并将参数设置为我喜欢的格式,但这不起作用。

谢谢。

【问题讨论】:

    标签: c# sqlite datetime windows-phone-8 mvvm


    【解决方案1】:

    您的 ViewModel 可以有一个带有 getter 的属性,用于格式化和显示值:

    public string FormattedDate
    {
        get { return Date.ToString("dddd dd MMMM yyyy"); }
    }
    

    或者,您的视图可以自己执行格式化。例如使用 WPF:

    <TextBlock Text="{Binding Date, StringFormat={}{0:dddd dd MMMM yyyy}}" /> 
    

    【讨论】:

    • 据我所知,WinRT 不允许使用 StringFormat,这就是我尝试使用转换器的原因。我认为我不能按照您提到的 getter 方式进行操作,因为它会干扰我插入数据库的方式,除非您的意思是制作一个完全独立的 getter 或其他东西?
    • 在我的示例中,Date 是包含从数据库中获取的实际值的 DateTime 属性,而 FormattedDate 是单独的 String 属性,它只是将该值作为字符串返回格式化显示。然后,您可以直接绑定到格式化字符串属性而不是原始日期。只要您的意图只是显示该值而不是修改它(因为您绑定到String而不是DateTime),这确实这个把戏很好。
    • 另外,您可以发布您的 StringFormatConverter 代码,也许会得到关于它为什么不起作用的答案。
    • 好的,我明白你对 FormattedDate 路线的看法了。因此,例如,我有一个简单的字符串来获取一个人按下按钮的日期。我必须将格式更改为“yyyy-MM-dd”,以便我可以在该日期使用一些聚合函数(根据月份选择数据); SleepDate = DateTime.Now.ToString("yyyy-MM-dd");上面的“SleepDate”绑定到一个文本块。
    • 当数据呈现给用户时,这种格式并不是最好看的,所以如果我想将格式更改为“dddd dd MMMM yyyy”而不影响我正在做的事情数据库、查询等。我只需执行以下操作;公共字符串 SleepDateFormatter { get { return DateTime.parse(SleepDate).toString("dddd dd MMMM yyyy");并将“SleepDateFormatter”绑定到文本块而不是 SleepDate? (不得不拆分评论,超过字符限制)
    猜你喜欢
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    相关资源
    最近更新 更多