【问题标题】:Flexing date format in XAML at runtime在运行时在 XAML 中调整日期格式
【发布时间】:2014-01-22 19:35:39
【问题描述】:

根据我的应用程序中的设置,我需要能够显示在 XAML 中显示日期的不同格式。例如,它需要采用"yyyy/MM/dd" 格式或"MM/dd/yyyy" 格式。

有哪些方法可以实现这一目标?请注意,我的应用程序中需要处理的地方是有限的,因此即使是“现场修复”类型的解决方案也适用于我的情况。

感谢您的建议。

【问题讨论】:

    标签: silverlight xaml silverlight-5.0


    【解决方案1】:

    您可以为此使用 ValueConverter。只需将 YourApplicationSettings.YearFirst 替换为您从中提取设置的位置即可。

    public class DateTime2FlexibleDateString : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var dt = value as DateTime?
            if (dt== null)
            {
                return null;
            }
    
            var dateTime = dt.Value;
    
            if (YourApplicationSettings.YearFirst)
            {
                return dateTime.ToString("yyyy/MM/dd");
            }
    
            return dateTime.ToString("MM/dd/yyyy");
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return null;
        }
    }
    

    然后在每个需要它的 xaml 文件中,或在 App.xaml(或添加到 App.xaml 的资源字典)中,为您的转换器添加静态资源。

    <UserControl.Resources>
        <converters:DateTime2FlexibleDateString x:Key="DateTime2FlexibleDateString" />
    </UserControl.Resources>
    

    然后当你绑定到日期时,指定转换器。

    <TextBlock Text="{Binding MyDateTimeVariable, Converter={StaticResource DateTime2FlexibleDateString}" />
    

    【讨论】:

      【解决方案2】:

      这取决于您正在执行的操作的上下文,但如果您绑定到 DateTime,那么您可以像这样更改 StringFormat 属性:

      <TextBlock Text="{Binding MyDateTimeVariable, StringFormat='yyyy/MM/dd'}" />
      <TextBlock Text="{Binding MyDateTimeVariable, StringFormat='MM/dd/yyyy'}" />
      

      Here 是一个很好的例子,可以通过这种方式实现一些不同的格式选项。

      【讨论】:

      • 是的,这是正确的,但我的问题是我如何“灵活”这些字符串格式?某些用户可能会设置该设置并且神奇地希望他们看到第一种格式,其他一些用户可能会设置该设置并且神奇地希望他们看到另一种格式
      • 哦,我明白了...好主意...让我在这里再放一会儿,看看其他人是否有其他想法。谢谢
      • @DevWannaBe 我刚刚意识到我之前的评论(我现在已经删除)是不正确的。因为 StringFormat 不是 DependencyProperty,所​​以您无法绑定到它。 This answer 提供了解决该问题的方法,但并不完全理想。
      • 感谢您的提醒,我认为我们也不能这样做,因为据我所知 Silverlight 仅支持一种绑定,但在 WPF 中我们可以进行两种绑定,这就是该示例的内容使用。
      • 转换器方法将是您的最佳选择。
      猜你喜欢
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 2016-02-19
      相关资源
      最近更新 更多