number c# xaml uwp string-formatting date-formatting

c# - number - string format percentage wpf



StringFormat on Binding (8)

¿Por qué complicar? Puede utilizar enlace de datos compilados

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

Ver:

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

Quiero formatear la Fecha a "dd / MM / aaaa", en otras palabras, sin la hora.

Lo intenté: <TextBlock Text="{Binding Date, StringFormat={}{0:dd/MM/yyyy}}"/> , pero no funciona.

Me da un error: la propiedad ''StringFormat'' no se encontró en el tipo ''Binding''.


Aquí hay un excelente ejemplo:

Ejemplo de MSDN

Si su clase de convertidor se encuentra en un espacio de nombres diferente (como se sugiere en una carpeta separada), puede agregar

xmlns:conv="using:MyNamespace.Converters"

y úsalo así:

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

El resto debe permanecer igual que en el ejemplo del enlace.


La mejor y la más sencilla sería utilizar un convertidor al que pase la Fecha y obtenga la cadena formateada. Por ejemplo, en el espacio de nombres 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(); } }

Y en su xaml solo haga referencia al convertidor y agregue el siguiente convertidor:

xmlns:conv="using:MyNamespace.Converters"

en su página xaml y en page.resources agregue esto

<conv:DateFormatConverter x:Name="DateToStringFormatConverter"/> <TextBlock Text="{Binding Date, Converter={StaticResource DateToStringFormatConverter}"/>


Lo bueno de StringFormat es que le permite especificar el formato de la salida. Aquí hay un convertidor que utilizo que te permite especificar el formato.

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

Cómo utilizar (ejemplo con múltiples formatos):

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


No hay ninguna propiedad llamada StringFormat en la clase Binding . Puedes usar Converter y ConverterParameter para hacer esto. Puede consultar Formateo o conversión de valores de datos para su visualización .

Por ejemplo, aquí, enlace la fecha de un DatePicker de fecha al texto de un 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>

código detrás, la clase 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; } }


Prueba esto,

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


Puedes hacerlo en xml. Aquí...

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


Sé que es tarde, pero tuve la misma pregunta y se me ocurrió esta solución. Quizás no sea el XAML más corto pero puro.

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