XAML自动类型转换

时间:2011-05-09 16:08:43

标签: c# .net wpf xaml

我注意到可以从值转换器中返回“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 );
        }

然后只是手动应用类型转换器的情况

2 个答案:

答案 0 :(得分:3)

您所引用的魔力是由于框架使用了TypeConverter属性。

如果这是您绑定的属性,也许您应该定义一个新的TypeConverter并使用TypeConverter属性修饰该属性。

http://blogs.windowsclient.net/rob_relyea/archive/2008/04/10/strings-to-things-or-how-xaml-interprets-attribute-values.aspx

答案 1 :(得分:1)

也许你可以试试BrushConverter