Xamarin custom MarkupExtension не работает со свойством Type - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь создать пользовательское MarkupExtension в формах Xamarin, используя Type в качестве свойства.К сожалению, я не могу передать свойство Type, в моем случае это всегда null.Вот минимальный пример моего MarkupExtension, возвращающего полное имя типа в виде строки:

[ContentProperty(nameof(TheType))]
public class TypeMarkupExtension : IMarkupExtension
{
    public Type TheType { get; set; }

    public object ProvideValue(IServiceProvider serviceProvider)
    {

        return TheType?.FullName ?? "Failure";
    }
}

Но что бы я ни пытался, использовать MarkupExtension невозможно, потому что TheType всегда null имое возвращаемое значение "Failure".Вот способ, которым я пытался использовать расширение как:

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

Код работает отлично, если я использую простой string в качестве типа свойства.Для меня это выглядит как передача Type, поскольку свойство невозможно.Это правильно или проблема с моим кодом?

1 Ответ

0 голосов
/ 25 августа 2018

Вариант-1: Укажите имя-свойства

Вам необходимо использовать здесь вложенное расширение-разметку (что вы уже сделали); но вам также нужно указать название свойства В противном случае, как показывают мои тесты, оно обрабатывается как строковое значение и присваивается свойству содержимого по умолчанию - следовательно, несоответствие типов.

Итак, явное указание имени свойства следующим образом должно решить проблему:

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

Вариант 2: Использовать распознаватель типов Xaml

Вы можете использовать XamlTypeResolver (ref: TypeExtension в 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";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...