Действительно ли возможно предоставить конвертер типов для статического ресурса в 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 определяется как целочисленный ресурс, но текстовое свойство ожидает строку. Этот пример изобретен, но надо надеяться иллюстрирует вопрос.

Вопрос, за исключением того, чтобы заставлять мой тип ресурса точно соответствовать типу свойства, там способ для меня обеспечить преобразователь для моих ресурсов? Что-то как IValueConverter для привязки или конвертера типов.

Спасибо!

12
задан Noctis 3 May 2014 в 07:10
поделиться

2 ответа

Это возможно, если вы используете привязку. Это может показаться немного странным, но на самом деле это будет работать:

<TextBlock Text="{Binding Source={StaticResource Today}}" />

Это потому, что механизм Binding имеет встроенное преобразование типов для основных типов. Кроме того, с помощью привязки, если встроенный конвертер не существует, вы можете указать свой собственный.

24
ответ дан 2 December 2019 в 05:27
поделиться

Ответ Эйба должен работать в большинстве ситуаций. Другим вариантом может быть расширение класса 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;
    }
}
4
ответ дан 2 December 2019 в 05:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: