StringFormat on Binding
Вид:
<TextBlock Text="{Binding Date}"/>
Я хочу отформатировать дату до "dd/MM/yyyy", другими словами, без времени.
Я попробовал: <TextBlock Text="{Binding Date, StringFormat={}{0:dd/MM/yyyy}}"/>
, но он не работает.
Дает мне ошибку: свойство "StringFormat" не было найдено в типе "Связывание".
Ответы
Ответ 1
Самый лучший и простой способ - использовать конвертер, с которым вы передаете дату, и вернуть форматированную строку. В частности. 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}"/>
Ответ 2
В классе Binding нет свойства с именем StringFormat
. Вы можете использовать Converter и ConverterParameter для этого. Вы можете обратиться к Форматирование или преобразование значений данных для отображения.
Например, здесь я привязываю дату 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;
}
}
Ответ 3
зачем усложнять? Вы можете использовать скомпилированную привязку данных
{x:Bind ViewModel.PropertyWithDateTime.ToString("....")}
Ответ 4
Я знаю, что это поздно, но у меня был такой же вопрос, и я придумал это решение. Возможно, это не самый короткий, но чистый XAML.
<TextBlock>
<Run Text="{x:Bind Foo.StartDate.Day}"/>.<Run Text="{x:Bind Foo.StartDate.Month}"/>.<Run Text="{x:Bind Foo.StartDate.Year}"/>
</TextBlock>
Ответ 5
Здесь есть отличный пример:
Пример из MSDN
если ваш класс конвертера находится в другом пространстве имен (как предлагается в отдельной папке), вы можете добавить
xmlns:conv="using:MyNamespace.Converters"
и используйте его следующим образом:
<UserControl.Resources>
<conv:DateToStringConverter x:Key="Converter1"/>
</UserControl.Resources>
остальное должно оставаться таким же, как в примере из ссылки.
Ответ 6
Вы можете сделать это в самом XML. Вот...
<DatePicker
SelectedDate="{Binding Date, Mode=TwoWay}"
Text="{Binding ., StringFormat='dd/MM/yyyy'}"/>
Ответ 7
Попробуйте это,
<Label x:Name="LblEstEndTime" Text="{Binding EndTime, StringFormat='Est. End Time: {0:MM/dd/yy h:mm tt}'}" Style="{StaticResource ListCellSubTitleStyle}" VerticalOptions="EndAndExpand" />
Ответ 8
Начиная с 14393, вы можете использовать функции в x: Bind.
Это означает, что вы можете отформатировать вашу дату как:
Text="{x:Bind sys:String.Format('{0:dd/MM/yyyy}', ViewModel.Date)}"
Просто убедитесь, что вы включили ссылку на пространство имен System:
<Page
xmlns:sys="using:System"
...
Ответ 9
Самое приятное в 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}}" />