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