2016-01-11 14 views
15

Xem:StringFormat trên Binding

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

Tôi muốn để định dạng ngày để "dd/MM/yyyy", nói cách khác, không có thời gian.

Tôi đã thử: <TextBlock Text="{Binding Date, StringFormat={}{0:dd/MM/yyyy}}"/> nhưng không hoạt động.

Cung cấp cho tôi lỗi: Thuộc tính 'StringFormat' không được tìm thấy trong loại 'Ràng buộc'.

Trả lời

16

Cách tốt nhất và dễ nhất là sử dụng trình chuyển đổi mà bạn vượt qua ngày và nhận lại chuỗi được định dạng. Ví dụ: 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(); 
    } 
} 

Và trong XAML của bạn chỉ cần tham khảo công cụ chuyển đổi và thêm bộ chuyển đổi sau:

xmlns:conv="using:MyNamespace.Converters" 

trong trang XAML của bạn và trong page.resources thêm này

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

<TextBlock Text="{Binding Date, Converter={StaticResource DateToStringFormatConverter}"/> 
+0

Nó không làm việc. Lỗi: Tài nguyên "DateStringToFormatConverter" không thể được giải quyết. – developer033

+0

Bạn phải khai báo bộ chuyển đổi trong xaml của bạn để sử dụng nó – CodeNoob

+0

Nếu bạn có thể chỉnh sửa câu trả lời của bạn cho một câu trả lời hoàn chỉnh, sẽ là tuyệt vời. – developer033

4

Có không có bất động sản nào có tên là StringFormat trong lớp Binding. Bạn có thể sử dụng ConverterConverterParameter để thực hiện việc này. Bạn có thể tham khảo Formatting or converting data values for display.

Ví dụ ở đây, tôi liên kết ngày DatePicker với văn bản của số 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> 

mã phía sau, lớp 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; 
    } 
} 
+0

Đến để cung cấp cho chính xác câu trả lời tương tự. Cách tốt nhất nó có thể được thực hiện là với một trình biến đổi, như được hiển thị ở trên, trừ khi bạn thay đổi Date thành một chuỗi trong code-behind và định dạng nó ở đó thay thế. [Thông tin về định dạng ngày giờ] (https://msdn.microsoft.com/en-us/library/az4se3k1 (v = vs.110) .aspx) –

+0

Thật không may, nó không hoạt động ở đây .. Loại ' local: DateFormatter 'không được tìm thấy. Tôi đang thiếu gì? – developer033

+0

Bạn cần tạo một lớp có tên DateFormatter, vui lòng xem lớp 'DateFormatter' của tôi. –

1

Có một ví dụ tuyệt vời ở đây:

Example from MSDN

nếu lớp chuyển đổi của bạn đang ở trong một không gian tên khác nhau (như được đề xuất trong một nếp gấp riêng biệt r) bạn có thể thêm

xmlns:conv="using:MyNamespace.Converters" 

và sử dụng nó như thế này:

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

phần còn lại nên giữ nguyên như trong ví dụ từ liên kết.

2

tại sao lại phức tạp? Bạn có thể sử dụng dữ liệu được biên dịch ràng buộc

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

Tôi biết điều này là muộn nhưng tôi đã có cùng một câu hỏi và đưa ra giải pháp này. Có lẽ không phải là XAML ngắn nhất nhưng thuần khiết.

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

Điều tốt đẹp về StringFormat là nó cho phép bạn chỉ định định dạng đầu ra. Đây là một công cụ chuyển đổi tôi sử dụng cho phép bạn chỉ định định dạng.

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

Làm thế nào để sử dụng (ví dụ với nhiều định dạng):

<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

Hãy thử điều này,

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

+1

Trong khi mã chỉ có câu trả lời có thể giải quyết vấn đề ban đầu, một số giải thích sẽ giúp rất nhiều trong việc hiểu được phương pháp bạn đã sử dụng và cách thức hoạt động. –

Các vấn đề liên quan