2016-01-11 102 views
15

查看:的StringFormat上绑定

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

我想要的日期格式为 “DD/MM/YYYY”,换句话说,没有时间。

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

给我一个错误:在'绑定'类型中找不到属性'StringFormat'。

回答

16

最好的也是最简单的方法是使用一个转换器,将Date传递给它并获取格式化的字符串。在例如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}"/> 
+0

它不工作。错误:资源“DateStringToFormatConverter”无法解析。 – developer033

+0

您必须在xaml中声明转换器才能使用它 – CodeNoob

+0

如果您可以编辑完整答案的答案,那就太好了。 – developer033

4

有在Binding类中没有名为StringFormat的属性。您可以使用ConverterConverterParameter来执行此操作。你可以参考Formatting or converting data values for display

例如,在这里,我将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类:

​​
+0

来给出完全相同的答案。最好的办法是使用转换器,如上所示,除非您将日期更改为代码隐藏字符串,并将其格式化。 [日期时间格式信息](https://msdn.microsoft.com/en-us/library/az4se3k1(v = vs.110).aspx) –

+0

不幸的是,它不在这里工作..类型'本地:DateFormatter'未找到。我错过了什么? – developer033

+0

您需要创建一个名为DateFormatter的类,请参阅我的DateFormatter类。 –

1

这里有一个很好的例子:

Example from MSDN

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

xmlns:conv="using:MyNamespace.Converters" 

,并使用它像这样:

<UserControl.Resources> 
    <conv:DateToStringConverter x:Key="Converter1"/> 
</UserControl.Resources> 

其余应保持一样从链接的例子。

2

为什么要复杂化?你可以使用编译的数据绑定

{x:Bind ViewModel.PropertyWithDateTime.ToString("....")} 
0

我知道这是迟到了,但我有同样的问题,并提出了这个解决方案。也许不是最短但纯粹的XAML。

<TextBlock> 
     <Run Text="{x:Bind Foo.StartDate.Day}"/>.<Run Text="{x:Bind Foo.StartDate.Month}"/>.<Run Text="{x:Bind Foo.StartDate.Year}"/> 
    </TextBlock> 
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}}" /> 
0

试试这个,

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

+1

虽然代码只有答案可能会解决原始问题,但一些解释将有助于理解您使用的方法以及它的工作原理。 –

相关问题