diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlSchemaContext.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlSchemaContext.cs index d1b8fda7a2..521405a48d 100644 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlSchemaContext.cs +++ b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlSchemaContext.cs @@ -7,6 +7,7 @@ using Portable.Xaml; using Portable.Xaml.ComponentModel; using am = Avalonia.Metadata; using Avalonia.Data; +using Avalonia.Markup.Xaml.Data; namespace Avalonia.Markup.Xaml.PortableXaml { @@ -54,17 +55,19 @@ namespace Avalonia.Markup.Xaml.PortableXaml } // MarkupExtension type could omit "Extension" part in XML name. - Type type = _avaloniaTypeProvider.FindType(xmlNamespace, xmlLocalName, genArgs) - ?? _avaloniaTypeProvider.FindType(xmlNamespace, - xmlLocalName + "Extension", - genArgs); + Type type = _avaloniaTypeProvider.FindType(xmlNamespace, + xmlLocalName, + genArgs) ?? + _avaloniaTypeProvider.FindType(xmlNamespace, + xmlLocalName + "Extension", + genArgs); if (type == null) { //let's try the simple types - //in Portable xaml xmlns:sys='clr-namespace:System;assembly=mscorlib' - //and sys:Double is not resolved + //in Portable xaml like xmlns:sys='clr-namespace:System;assembly=mscorlib' + //and sys:Double is not resolved properly return ResolveSimpleTypeName(xmlNamespace, xmlLocalName); } @@ -91,6 +94,9 @@ namespace Avalonia.Markup.Xaml.PortableXaml private static Dictionary, XamlType> _simpleXamlTypes; + //in Portable xaml like xmlns:sys='clr-namespace:System;assembly=mscorlib' + //and sys:Double is not resolved properly + [Obsolete("TODO: remove once it's fixed in Portable.xaml")] private static XamlType ResolveSimpleTypeName(string xmlNamespace, string xmlLocalName) { if (_simpleXamlTypes == null) @@ -125,13 +131,33 @@ namespace Avalonia.Markup.Xaml.PortableXaml public override XamlType GetXamlType(Type type) { + XamlType result = null; + + if (_cachedTypes.TryGetValue(type, out result)) + { + return result; + } + + _cachedTypes[type] = result = GetAvaloniaXamlType(type) ?? base.GetXamlType(type); + + return result; + } + + private XamlType GetAvaloniaXamlType(Type type) + { + if (type == typeof(Binding)) + { + return new BindingXamlType(type, this); + } + + //TODO: do we need it ??? //if (type.FullName.StartsWith("Avalonia.")) //{ // return new AvaloniaXamlType(type, this); //} - return base.GetXamlType(type); - } + return null; + } protected override XamlMember GetAttachableProperty(string attachablePropertyName, MethodInfo getter, MethodInfo setter) { @@ -164,5 +190,7 @@ namespace Avalonia.Markup.Xaml.PortableXaml return base.GetProperty(pi); } + + private Dictionary _cachedTypes = new Dictionary(); } } \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlType.cs b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlType.cs index 350d56471c..c6bfd514e5 100644 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlType.cs +++ b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlType.cs @@ -3,23 +3,31 @@ using System.Collections.Generic; using System.Reflection; using Avalonia.Data; using Portable.Xaml; +using Portable.Xaml.Markup; using Portable.Xaml.Schema; - namespace Avalonia.Markup.Xaml.PortableXaml { - //public class AvaloniaXamlType : XamlType - //{ - // public AvaloniaXamlType(Type underlyingType, XamlSchemaContext schemaContext) : - // base(underlyingType, schemaContext) - // { - // } - - // protected override XamlMember LookupMember(string name, bool skipReadOnlyCheck) - // { - // return base.LookupMember(name, skipReadOnlyCheck); - // } - //} + public class AvaloniaXamlType : XamlType + { + public AvaloniaXamlType(Type underlyingType, XamlSchemaContext schemaContext) : + base(underlyingType, schemaContext) + { + } + } + + public class BindingXamlType : AvaloniaXamlType + { + public BindingXamlType(Type underlyingType, XamlSchemaContext schemaContext) : + base(underlyingType, schemaContext) + { + } + + public override bool CanAssignTo(XamlType xamlType) + { + return true; + } + } public class AvaloniaPropertyXamlMember : XamlMember { diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs index 4cc653fc62..b6dedc3375 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs @@ -247,12 +247,8 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml + ContentTemplate='{TemplateBinding ContentTemplate}' /> ";