wake-up-neo.com

StringFormat beim Binden

Aussicht: 

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

Ich möchte das Datum in "TT/MM/JJJJ" formatieren, also ohne Zeit.

Ich habe es ausprobiert: <TextBlock Text="{Binding Date, StringFormat={}{0:dd/MM/yyyy}}"/>, aber es funktioniert nicht.

Gibt einen Fehler aus: Die Eigenschaft 'StringFormat' wurde nicht im Typ 'Binding' gefunden.

17
developer033

Der beste und einfachste Weg wäre, einen Konverter zu verwenden, an den Sie das Datum übergeben und die formatierte Zeichenfolge zurückbekommen. In z. MyNamespace.Converters namespace:

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

Und verweisen Sie in Ihrem xaml einfach auf den Konverter und fügen Sie den folgenden Konverter hinzu:

xmlns:conv="using:MyNamespace.Converters" 

fügen Sie dies in Ihrer XAML-Seite und in Page.resources hinzu

<conv:DateFormatConverter x:Name="DateToStringFormatConverter"/>

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

Es gibt keine Eigenschaft mit dem Namen StringFormat in Binding class. Sie können dazu Converter und ConverterParameter verwenden. Sie können auf Formatierung oder Konvertierung von Datenwerten für die Anzeige verweisen.

Zum Beispiel binde ich das Datum einer DatePicker an den Text einer 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>

code hinter der DateFormatter-Klasse:

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;
    }
}
5
Grace Feng

warum komplizieren? Sie können die kompilierte Datenbindung verwenden 

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

Seit 14393 können Sie Funktionen in x: Bind verwenden.

Dies bedeutet, dass Sie Ihr Datum wie folgt formatieren können:

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

Stellen Sie einfach sicher, dass Sie einen Verweis auf den System-Namespace eingefügt haben:

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

Ich weiß, das ist spät, aber ich hatte die gleiche Frage und kam zu dieser Lösung. Vielleicht nicht das kürzeste aber reine XAML.

    <TextBlock>
        <Run Text="{x:Bind Foo.StartDate.Day}"/>.<Run Text="{x:Bind Foo.StartDate.Month}"/>.<Run Text="{x:Bind Foo.StartDate.Year}"/>
    </TextBlock>
1
マックス

Hier gibt es ein hervorragendes Beispiel:

Beispiel aus MSDN

wenn sich Ihre Konverter-Klasse in einem anderen Namespace befindet (wie vorgeschlagen, sich in einem separaten Ordner zu befinden), können Sie hinzufügen

xmlns:conv="using:MyNamespace.Converters"

und benutze es so: 

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

der Rest sollte wie im Beispiel aus dem Link bleiben.

1
Christoph

Sie können dies in XML selbst tun. Hier...

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

Das Schöne an StringFormat ist, dass Sie das Format der Ausgabe festlegen können. Ich verwende hier einen Konverter, mit dem Sie das Format angeben können.

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

Verwendung (Beispiel mit mehreren Formaten):

<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
Knelis

Versuche dies,

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

0