代码之家  ›  专栏  ›  技术社区  ›  Fruchtzwerg

Xamarin自定义MarkupExtension不使用类型属性

  •  0
  • Fruchtzwerg  · 技术社区  · 6 年前

    我正试图用Xamarin表单创建一个自定义的MarkupExtension Type 作为财产。不幸的是,我不能通过 类型 ,在我的情况下,财产总是 null . 下面是我的MarkupExtension的最小示例,它将类型的全名返回为string:

    [ContentProperty(nameof(TheType))]
    public class TypeMarkupExtension : IMarkupExtension
    {
        public Type TheType { get; set; }
    
        public object ProvideValue(IServiceProvider serviceProvider)
        {
    
            return TheType?.FullName ?? "Failure";
        }
    }
    

    TheType 总是 我的回报是 "Failure" . 下面是我尝试使用分机的方式,例如:

    <Label Text="{local:TypeMarkup x:Int16}"/>
    <Label Text="{local:TypeMarkup {x:Type x:Int16}}"/>
    

    如果我使用一个简单的 string 类型

    1 回复  |  直到 6 年前
        1
  •  1
  •   Sharada    6 年前

    您需要在此处使用嵌套标记扩展(您已经使用过);但还需要指定属性的名称。否则,我的测试显示,它被视为一个字符串值并分配给默认内容属性-因此,类型不匹配。

    <Label Text="{local:TypeMarkup TheType={x:Type x:Int16}}" ../>
    

    选项2:使用Xaml类型解析器

    你可以用 XamlTypeResolver (参考: TypeExtension in Xamarin.Forms )

    [ContentProperty(nameof(TheType))]
    public class TypeMarkupExtension : IMarkupExtension
    {
        public string TheType { get; set; }
    
        public object ProvideValue(IServiceProvider serviceProvider)
        {
            if (string.IsNullOrEmpty(TheType))
                throw new InvalidOperationException("TheType isn't set.");
    
            if (serviceProvider == null)
                throw new ArgumentNullException(nameof(serviceProvider));
    
            var typeResolver = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;
            if (typeResolver == null)
                throw new ArgumentException("No IXamlTypeResolver in IServiceProvider");
    
            var resolvedType = typeResolver.Resolve(TheType, serviceProvider);
            return resolvedType?.FullName ?? "Failure";
        }
    }