XamlServices是否尊重ValueConverterAttribute?

时间:2017-09-15 09:28:36

标签: c# .net xaml valueconverter

我正在使用XAML作为序列化机制(对于配置,它不是WPF控件),我想使用自定义ValueSerializer。请忽略糟糕的实施,它只是MCVE。

这是我想要自定义序列化程序的类型:

[ValueSerializer(typeof(PositionSerializer))]
public sealed class Position
{
    public double X { get; set; }
    public double Y { get; set; }
}

这是自定义序列化程序:

public sealed class PositionSerializer : ValueSerializer
{
    public override bool CanConvertFromString(string value, IValueSerializerContext context)
    {
        return true;
    }

    public override object ConvertFromString(string value, IValueSerializerContext context)
    {
        if (String.IsNullOrWhiteSpace(value))
            return new Position();

        string[] parts = value.Split(',', ' ');
        return new Position
        {
            X = Parse(parts[0]),
            Y = Parse(parts[1])
        };
    }

    private static double Parse(string value)
        => Double.Parse(value, NumberStyles.Number, CultureInfo.InvariantCulture);
}

这是容器:

public sealed class Test
{
    public Position Location { get; set; }
}

要反序列化对象,我使用此代码:

var test = (Test)System.Xaml.XamlServices.Load(@"c:\test.xaml");

test.xaml只是:

<Test xmlns="clr-namespace:test;assembly=test" Location="2,3"></Test>

运行此代码时,我得到:

  

System.Xaml.XamlObjectWriterException:设置属性'test.Test.Location'抛出异常。 ---&GT; System.ArgumentException:'System.String'类型的对象无法转换为'test.Position'类型。

同样的结果:

<Test xmlns="clr-namespace:test;assembly=test">
  <Test.Location>2,3</Test.Location>
</Test>

即使直接在[ValueSerializer(typeof(PositionSerializer))]属性上应用Test.Location也不会改变任何内容。使用TypeConverter按预期工作,但我不能这样做(我很想知道为什么这不起作用)。

使用XamlServices.Save()进行序列化时,也会忽略它(显然会添加ConvertToString()CanConvertToString()方法。)

0 个答案:

没有答案