Ràng buộc trong Silverlight yêu cầu đối tượng Nguồn hoặc đối tượng Phụ thuộc. Từ đối tượng nguồn đó, bạn có thể liên kết với các thuộc tính (do đó theo định nghĩa bạn ràng buộc với các cá thể thành viên) hoặc các thuộc tính phụ thuộc.
Vì DateTime.Now
là thuộc tính tĩnh, bạn không thể liên kết trực tiếp với nó trong Silverlight, do đó cần có một số mã. Điều tốt nhất tiếp theo là sử dụng mã để: -
- đảm bảo như phần lớn những gì bạn cần thể được thể hiện trong XAML
- để làm như vậy một cách như de-coupled càng tốt.
Do đó chúng tôi có thể phân tích rằng chúng tôi cần hai điều.
- Expose các thành viên tĩnh của DateTime như tài sản thể hiện của một số đối tượng
- Có một số cách để định dạng DateTime cho một đầu ra mong muốn.
Xử lý mục đầu tiên tôi sẽ tạo ra một lớp StaticSurrogate
, nơi tôi sẽ tạo ra tính chất ví dụ cho các thuộc tính tĩnh mà chúng ta cần truy cập vào: -
public class StaticSurrogate
{
public DateTime Today { get { return DateTime.Today; } }
public DateTime Now { get { return DateTime.Now; } }
}
Bây giờ chúng ta cần một cách để định dạng một Ngày giờ. Một chuyển đổi giá trị là công cụ thích hợp cho công việc này, mượn rất nhiều từ này Tim Heuer Blog: -
public class FormatConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (parameter != null)
{
string formatterString = parameter.ToString();
if (!String.IsNullOrEmpty(formatterString))
{
return String.Format(culture, String.Format("{{0:{0}}}", formatterString), value);
}
}
return (value ?? "").ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Với hai loại cổ phiếu này tại chỗ chúng tôi bây giờ có thể làm phần còn lại trong XAML, trước hết chúng ta cần thể hiện của các lớp này trong các nguồn lực của chúng tôi : -
<UserControl.Resources>
<local:StaticSurrogate x:Key="Static" />
<local:FormatConverter x:Key="Formatter" />
</UserControl.Resources>
Bây giờ chúng ta có thể cấp điện cho thiết TextBlock
: -
<TextBlock Text="{Binding Today, Source={StaticResource Static},
Converter={StaticResource Formatter}, ConverterParameter='dd MMM yyy'}" />
Lưu ý rằng phương pháp này có những ưu điểm sau: -
- chúng tôi không cần phải thêm mã vào UserControl mà trên đó TextBlock được đặt, cũng như chúng ta không phải loay hoay với bất kỳ ngữ cảnh dữ liệu nào.
- Tài nguyên tĩnh có thể được đặt trong các tài nguyên App.Resources sẽ làm cho việc tạo TextBlock hoàn toàn độc lập với việc phải thêm bất kỳ thứ gì khác vào UserControl.
- Định dạng được sử dụng để hiển thị ngày có thể được sửa đổi độc lập.
- Truy cập vào các thuộc tính tĩnh bổ sung có thể dễ dàng được thêm vào lớp
StaticSurrogate
.
Điều đó làm cho ý nghĩa với tôi nhưng nó không có vẻ cực đoan so với cú pháp Flex: text = "{new Date()}". Tôi đoán tất cả những điều này sẽ tóm tắt một thực tế là Silverlight chỉ hỗ trợ một vài phần mở rộng Markup bên trong XAML. Nó sẽ được tốt đẹp nếu họ thực hiện đánh giá cú đúp xoăn mạnh mẽ hơn mặc dù. Cảm ơn bạn đã giúp đỡ! –