XAML 自动类型转换

Dea*_*bit 5 .net c# 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 );
}
Run Code Online (Sandbox Code Playgroud)

我认为因为我正在代码中创建多重绑定+转换器,所以它跳过了命名空间中某处的步骤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 );
        }
Run Code Online (Sandbox Code Playgroud)

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

fos*_*son 5

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

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

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