Возможно ли поставлять конвертер типов для статического ресурса в WPF?
У меня есть вопрос WPF для новичков.
Представьте, что мой пользовательский элемент управления имеет объявление пространства имен, подобное этому:
xmlns:system="clr-namespace:System;assembly=mscorlib"
И у меня есть ресурсы для пользовательского элемента управления следующим образом:
<UserControl.Resources>
<system:Int32 x:Key="Today">32</system:Int32>
</UserControl.Resources>
А потом где-то в моем пользовательском управлении у меня есть это:
<TextBlock Text="{StaticResource Today}"/>
Это приведет к ошибке, поскольку Today
определяется как целочисленный ресурс, но свойство Text ожидает строку. Этот пример надуман, но, надеюсь, иллюстрирует вопрос.
Вопрос в том, что мой тип ресурса точно соответствует типу свойств, есть ли способ предоставить конвертер для моих ресурсов? Что-то вроде IValueConverter для привязок или преобразователя типов.
Спасибо!
Ответы
Ответ 1
Возможно, если вы используете привязку. Это кажется немного странным, но это действительно сработает:
<TextBlock Text="{Binding Source={StaticResource Today}}" />
Это связано с тем, что механизм привязки имеет встроенное преобразование типов для базовых типов. Кроме того, используя Binding, если встроенный конвертер не существует, вы можете указать свой собственный.
Ответ 2
Ответ Abe должен работать в большинстве ситуаций. Другой вариант - расширить класс StaticResourceExtension
:
public class MyStaticResourceExtension : StaticResourceExtension
{
public IValueConverter Converter { get; set; }
public object ConverterParameter { get; set; }
public MyStaticResourceExtension()
{
}
public MyStaticResourceExtension(object resourceKey)
: base(resourceKey)
{
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
object value = base.ProvideValue(serviceProvider);
if (Converter != null)
{
Type targetType = typeof(object);
IProvideValueTarget target = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
if (target != null)
{
DependencyProperty dp = target.TargetProperty as DependencyProperty;
if (dp != null)
{
targetType = dp.PropertyType;
}
else
{
PropertyInfo pi = target.TargetProperty as PropertyInfo;
if (pi != null)
{
targetType = pi.PropertyType;
}
}
}
value = Converter.Convert(value, targetType, ConverterParameter, CultureInfo.CurrentCulture);
}
return value;
}
}