Для привязки в Silverlight требуется объект-источник или объект зависимости. Из этого исходного объекта вы можете связать со свойствами (следовательно, по определению вы связываетесь с членами экземпляра) или со свойствами зависимости.
Так как 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 : -
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'}" />
Обратите внимание, что этот подход имеет следующие преимущества: -
- нам не нужно добавлять код в UserControl, в который помещается TextBlock, и при этом нам не нужно возиться с каким-либо контекстом данных.
- Статические ресурсы могут быть размещены в App.Resources, что сделает создание TextBlock полностью независимым от необходимости добавлять что-либо еще в UserControl.
- Форматирование, используемое для отображения даты, может быть изменено независимо.
- Доступ к дополнительным статическим свойствам можно легко добавить к классу
StaticSurrogate
.