Silverlight 中的绑定需要 Source 对象或 Dependency 对象。您可以从该源对象绑定到属性(因此根据定义,您绑定到实例成员)或依赖属性。
由于DateTime.Now 是一个静态属性,您无法在 Silverlight 中直接绑定到它,因此需要一些代码。下一个最好的事情是使用代码:-
- 确保尽可能多地在 XAML 中表达您需要的内容
- 以尽可能解耦的方式这样做。
因此我们可以分析出我们需要两件事。
- 将 DateTime 的静态成员公开为某个对象的实例属性
- 有一些方法可以将 DateTime 格式化为所需的输出。
为了处理第一项,我将创建一个StaticSurrogate 类,在其中我将为我们需要访问的静态属性创建实例属性:-
public class StaticSurrogate
{
public DateTime Today { get { return DateTime.Today; } }
public DateTime Now { get { return DateTime.Now; } }
}
现在我们需要一种格式化日期时间的方法。价值转换器是这项工作的正确工具,大量借鉴了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();
}
}
有了这两个类,我们现在可以在 Xaml 中完成剩下的工作,首先我们需要资源中这些类的实例:-
<UserControl.Resources>
<local:StaticSurrogate x:Key="Static" />
<local:FormatConverter x:Key="Formatter" />
</UserControl.Resources>
现在我们可以连接TextBlock :-
<TextBlock Text="{Binding Today, Source={StaticResource Static},
Converter={StaticResource Formatter}, ConverterParameter='dd MMM yyy'}" />
请注意,这种方法具有以下优点:-
- 我们不需要向放置 TextBlock 的 UserControl 添加代码,也不需要摆弄任何数据上下文。
- 静态资源可以放置在 App.Resources 中,这将使 TextBlock 的创建完全独立于必须向 UserControl 添加任何其他内容。
- 可以单独修改用于显示日期的格式。
- 可以轻松地将对其他静态属性的访问权限添加到
StaticSurrogate 类中。