绑定上的StringFormat

时间:2016-01-11 01:59:06

标签: c# xaml uwp string-formatting date-formatting

查看:

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

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

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

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

9 个答案:

答案 0 :(得分:20)

最好也是最简单的方法是使用转换器传递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}"/>

答案 1 :(得分:5)

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类:

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;
    }
}

答案 2 :(得分:3)

为何复杂化?您可以使用编译数据绑定

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

答案 3 :(得分:2)

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

imageview.setImageResource((R.drawable.my_animation);

答案 4 :(得分:1)

这里有一个很好的例子:

Example from MSDN

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

Letcani

并像这样使用它:

xmlns:conv="using:MyNamespace.Converters"

其余部分应与链接中的示例保持一致。

答案 5 :(得分:1)

您可以在xml中执行此操作。这里...

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

答案 6 :(得分:1)

从14393开始,您可以使用functions in x:Bind

这意味着您可以将日期格式设置为:

Text="{x:Bind sys:String.Format('{0:dd/MM/yyyy}', ViewModel.Date)}"

只需确保已包含对System名称空间的引用:

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

答案 7 :(得分:0)

试试这个,

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

答案 8 :(得分:-1)

关于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}}" />