【问题标题】:XAML Automatic Type ConversionXAML 自动类型转换
【发布时间】: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 类本身上。您可能希望您的代码也在那里检查。

标签: c# .net wpf xaml


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    也许你可以试试BrushConverter

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 2011-12-17
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多