XAML 将一个类类型转换为另一个类类型的类型转换器

pkln4tw6  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(184)
using System;
using System.ComponentModel;
using System.Globalization;
using System.Reflection;
using System.Xaml;

namespace Example
{
    public class MyConverter : TypeConverter
    {
        public override object ConvertFrom( ITypeDescriptorContext context , CultureInfo culture , object value )
        {
            Type type1 = ( (dynamic) value ).GetType();
            Type type2 = typeof( Foo<> ).MakeGenericType( type1 );
            object instance = Activator.CreateInstance( type2 );
            PropertyInfo prp = type2.GetProperty( nameof( Foo<byte>.Value ) );
            prp.SetValue( instance , Convert.ChangeType( value , type1 ) );
            return instance;
        }

    }

    public class Foo<T>
    {
        public T Value { get; set; }
    }

    public class Bar
    {
        public int SomeNumber { get; set; }
    }

    public class MyClass
    {
        [TypeConverter( typeof( MyConverter ) )]
        public Foo<Bar> MyProperty { get; set; }

        public void ConvertImplicit()
        {
            string xml = "<MyClass xmlns=\"http://Example\"> <MyClass.MyProperty> <Bar SomeNumber=\"5\" /> </MyClass.MyProperty> </MyClass>";
            MyClass myClass = XamlServices.Parse( xml ) as MyClass;
        }

        public void ConvertExplicit()
        {
            MyConverter myConverter = new MyConverter();
            Bar bar = new Bar() { SomeNumber = 5 };
            Foo<Bar> target = myConverter.ConvertFrom( null , null , bar ) as Foo<Bar>;
        }

    }
}

显示的TypeConverter在显式转换时按预期工作,如ConvertExplicit中所示。当隐式完成转换时,如ConvertImplicit中所示,将引发异常,表明无法设置MyProperty。
因为没有像ConvertExplicit中那样完成最终强制转换,所以引发异常。
使用TypeConverter进行隐式转换时(例如,使用XamlServices时),无法执行最终转换。
如何修改我的TypeConverter,使其像ConvertExplicit一样工作(转换后没有最终转换)?
顺便说一下:要运行ConvertImplicit,您需要将此代码添加到AssemblyInfo.cs [assembly:XML文件定义("http://示例,""示例")]

gwbalxhn

gwbalxhn1#

根据documentation,XAML将使用类型转换器仅从字符串进行转换,而不从其他类型(如示例中的Bar)进行转换:
对于XAML来说,只有处理字符串输入的代码路径才是重要的。

相关问题