字符串绑定中的格式化操作

24

查看:

<TextBlock Text="{Binding Date}"/>

我想将日期格式化为“dd/MM/yyyy”,换句话说,不包括时间。

我尝试过这样做:<TextBlock Text="{Binding Date, StringFormat={}{0:dd/MM/yyyy}}"/>,但它不起作用。

给我一个错误:在类型“Binding”中未找到属性“StringFormat”。

9个回答

25

最好、最简单的方式是使用转换器来传递日期,并获得格式化后的字符串。例如,在MyNamespace.Converters命名空间中:

public class DateFormatConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value == null)
            return null;

        DateTime dt = DateTime.Parse(value.ToString());
        return dt.ToString("dd/MM/yyyy");
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

在你的XAML中引用转换器,并添加以下转换器:

xmlns:conv="using:MyNamespace.Converters" 

在你的XAML页面中,在page.resources中添加以下内容。
<conv:DateFormatConverter x:Name="DateToStringFormatConverter"/>

<TextBlock Text="{Binding Date, Converter={StaticResource DateToStringFormatConverter}"/>

不起作用。错误:无法解析资源“DateStringToFormatConverter”。 - developer033
您必须在 XAML 中声明转换器才能使用它。 - CodeNoob
如果您能编辑您的回答并给出一个完整的答案,那就太好了。 - developer033
5
使用参数来传递格式字符串,这样就可以完成任务。我想知道为什么他们没有在UWP中实现StringFormat? - Billy Jake O'Connor

8

我知道现在可能有点晚了,但是我也有同样的问题,并且想出了这个解决方案。虽然不一定是最简洁的方法,但它是纯XAML。

    <TextBlock>
        <Run Text="{x:Bind Foo.StartDate.Day}"/>.<Run Text="{x:Bind Foo.StartDate.Month}"/>.<Run Text="{x:Bind Foo.StartDate.Year}"/>
    </TextBlock>

7
Binding类中不存在名为StringFormat的属性。您可以使用ConverterConverterParameter来实现此功能。您可以参考格式化或转换数据值以供显示
以下是一个绑定DatePicker日期到TextBlock文本的示例:
XAML:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.Resources>
        <local:DateFormatter x:Key="DateConverter"/>
    </Grid.Resources>
    <DatePicker Name="ConverterParmeterCalendarViewDayItem"></DatePicker>
    <TextBlock Height="100" VerticalAlignment="Top" Text="{Binding ElementName=ConverterParmeterCalendarViewDayItem, Path=Date, Converter={StaticResource DateConverter},ConverterParameter=\{0:dd/MM/yyyy\}}" />
</Grid>

在代码后台,使用DateFormatter类:

public class DateFormatter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var a = language;
        // Retrieve the format string and use it to format the value.
        string formatString = parameter as string;
        if (!string.IsNullOrEmpty(formatString))
        {
            return string.Format(formatString, value);
        }

        return value.ToString();
    }

    // No need to implement converting back on a one-way binding
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return DependencyProperty.UnsetValue;
    }
}

不幸的是,它在这里无法运行。类型“local:DateFormatter”未找到。我错过了什么? - developer033
@developer033 好的,请查看我分享的示例 StringFormatInBinding - Grace Feng
@GraceFeng-MSFT 我下载了你的项目并将所有内容都设置为相等... 仍然出现同样的错误:"找不到类型 'local:DateFormatter'。请验证您是否没有丢失程序集引用,并且所有引用的程序集都已构建。"。 - developer033
你删除了这个xmlns:local="using:'your project'"吗?如果没有,XAML设计工具可能会出现问题,它可能被标记为错误,但你仍然可以运行这个项目,它应该能正常工作。 - Grace Feng
如果XAML抱怨找不到您的DateFormatter的引用,请确保xmls:local变量指向正确的命名空间。您可以始终创建一个名为任何名称的新xmls引用,以指向特定文件。 - stevokk
显示剩余4条评论

6
自14393开始,您可以在x:Bind中使用函数。函数绑定的使用意味着您可以像以下这样格式化日期:
Text="{x:Bind sys:String.Format('{0:dd/MM/yyyy}', ViewModel.Date)}"

确保您已经包含了对System命名空间的引用:

<Page 
     xmlns:sys="using:System"
     ...

4
为什么要复杂化?您可以使用编译数据绑定。
{x:Bind ViewModel.PropertyWithDateTime.ToString("....")}

1

这里有一个很好的例子:

MSDN上的示例

如果您的转换器类在不同的命名空间中(建议放在单独的文件夹中),您可以添加:

xmlns:conv="using:MyNamespace.Converters"

并像这样使用它:
<UserControl.Resources>
  <conv:DateToStringConverter x:Key="Converter1"/>
</UserControl.Resources>

剩下的部分应该与链接中的示例保持相同。

0

StringFormat 的好处在于它允许您指定输出的格式。这是我使用的一个转换器,它允许您指定格式。

public sealed class DateTimeToStringConverter : IValueConverter
{
    public static readonly DependencyProperty FormatProperty =
        DependencyProperty.Register(nameof(Format), typeof(bool), typeof(DateTimeToStringConverter), new PropertyMetadata("G"));

    public string Format { get; set; }

    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is DateTime dateTime && value != null)
        {
            return dateTime.ToString(Format);
        }

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return DateTime.ParseExact(value.ToString(), Format, CultureInfo.CurrentCulture);
    }
}

如何使用(带有多种格式的示例):

<Page.Resources>
    <ResourceDictionary>
        <converters:DateTimeToStringConverter 
            x:Name="dateStringConverter" 
            Format="dd-MM-yyyy" />
        <converters:DateTimeToStringConverter
            x:Name="timeStringConverter"
            Format="HH:mm" />
    </ResourceDictionary>
</Page.Resources>

<!-- Display the date -->
<TextBlock Text="{Binding Path=Date, Converter={StaticResource dateStringConverter}}" />    

<!-- Display the time -->
<TextBlock Text="{Binding Path=Date, Converter={StaticResource timeStringConverter}}" />

-1

试一下这个,

<Label x:Name="LblEstEndTime" Text="{Binding EndTime, StringFormat='Est. End Time: {0:MM/dd/yy h:mm tt}'}" Style="{StaticResource ListCellSubTitleStyle}" VerticalOptions="EndAndExpand" />


1
虽然仅靠代码回答可能会解决原始问题,但一些说明会对理解你使用的方法及其工作方式有很大帮助。 - Nigel Ren
2
这不是一个UWP解决方案。 - Shahriar

-1

你可以在xml本身中完成这个操作。在这里...

<DatePicker 
SelectedDate="{Binding Date, Mode=TwoWay}" 
Text="{Binding ., StringFormat='dd/MM/yyyy'}"/>

4
在UWP的Binding类中,不存在StringFormat。此外,XML与XAML并不相同。虽然XAML是基于XML的技术,但XAML和XML并不是可互换的术语。 - The Pademelon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接