【发布时间】:2011-05-09 16:08:43
【问题描述】:
我注意到有可能从值转换器返回诸如“Visible”、“Collapsed”、“Images/xyz.png”或“#FFB3D1”之类的字符串,并且绑定的魔力设法解决了这个问题。隐藏/显示 UI 元素,找到 xyz.png 图像或将某些东西涂成粉红色...
长期以来我一直认为这是理所当然的,现在它不适用于我的最新代码,所以我的问题是如何手动调用此功能?
说明:
我通过创建自定义 MarkupExtension 进行了扩展,它附加了一个 MultiConverter 将它附加到一个 MultiBinding 并返回初始化的绑定。但是,当这个多转换器返回“#FFB3D1”或“Red”之类的字符串时,似乎什么都没有发生。
// PseudoCode from my MarkupExtension, setting up & returning the binding/multi-converter
public override object ProvideValue( IServiceProvider serviceProvider )
{
MultiBinding outputBinding = new MultiBinding();
foreach ( Binding b in bindings )
{
outputBinding.Bindings.Add( b );
}
outputBinding.Converter = converter;
return outputBinding.ProvideValue( serviceProvider );
}
我推测因为我在代码中创建了 Multibinding + Converter,所以它在 Binding.Magic 命名空间中的某处跳过了一个步骤。
解决方案:
public override object ProvideValue( IServiceProvider serviceProvider )
{
// get targets
IProvideValueTarget serv = (IProvideValueTarget)serviceProvider.GetService( typeof( IProvideValueTarget ) );
// get Type Converter
object[] typeConverterAttributes = ( (DependencyProperty)serv.TargetProperty ).PropertyType.GetCustomAttributes( typeof( TypeConverterAttribute ), true );
TypeConverter typeConverter = null;
if ( typeConverterAttributes.Length > 0 )
{
TypeConverterAttribute attr = (TypeConverterAttribute)typeConverterAttributes[0];
typeConverter = (TypeConverter)Activator.CreateInstance( Type.GetType( attr.ConverterTypeName ), false );
}
那就是手动应用类型转换器的简单例子
【问题讨论】:
-
TypeConverter 属性也可以在属性的类型上声明,例如,在 Brush 类本身上。您可能希望您的代码也在那里检查。