我有一个新手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的绑定或类型转换器。
谢谢!
答案 0 :(得分:23)
如果使用绑定,则可以。这看起来有点奇怪,但实际上会有效:
<TextBlock Text="{Binding Source={StaticResource Today}}" />
这是因为Binding引擎具有基本类型的内置类型转换。此外,通过使用Binding,如果内置转换器不存在,您可以指定自己的。
答案 1 :(得分:4)
安倍的回答应该适用于大多数情况。另一种选择是扩展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;
}
}