Эквивалент x: введите в UWP

У меня есть этот класс:

public class EditorKey
{
    public Type TargetType { get; set; }
    public DataTemplate Template { get; set; }
}

Теперь я хочу создать экземпляр этого класса в XAML. Поскольку в UWP у нас нет расширения разметки x:Type, я указываю тип непосредственно в виде строки с правильным префиксом TargetType="model:Customer".

<Page
    x:Class="App8.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:model="using:App8"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <ContentControl>
        <model:EditorKey TargetType="model:Customer" />
    </ContentControl>

</Page>

Запустив это, я получаю исключение времени выполнения:

Не удалось создать «App8.EditorKey» из текста «модель: клиент».

Как я могу сопоставить строку с фактическим типом?


person SuperJMN    schedule 18.11.2017    source источник
comment
Не уверен, что это то, о чем вы спрашиваете, но если вам нужно указать пространство имен model XML, вы делаете это, добавляя xmlns:model="using:Namespace.Of.Your.Model" к (обычно) корневому элементу XAML.   -  person Marian Dolinský    schedule 18.11.2017
comment
Пожалуйста, проверьте обновленный вопрос. Теперь совершенно ясно, о чем я спрашиваю. Спасибо :)   -  person SuperJMN    schedule 19.11.2017
comment
Как насчет использования Namespace.Of.Your.Model.Customer (классическое полное имя типа C#) вместо использования пространства имен XML? Это работает?   -  person Marian Dolinský    schedule 19.11.2017
comment
Это не работает, если вы также не укажете сборку Namespace.Of.Your.Model.Customer, Assembly. Это действительно многословно :)   -  person SuperJMN    schedule 19.11.2017


Ответы (1)


Обычный способ сделать это в UWP — просто указать ссылку в виде строки:

<model:EditorKey TargetType="model:Customer" />

Если это не сработает, попробуйте указать полное пространство имен, а не определять xmlns.

Пример:

<model:EditorKey TargetType="App8.Customer" />

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

[MarkupExtensionReturnType(ReturnType = typeof(Type))]
public sealed class TypeExtension : MarkupExtension
{
    public Type Type { get; set; }

    /// <inheritdoc/>
    protected override object ProvideValue() => Type;
}

И используйте его так:

<model:EditorKey TargetType="{local:Type Type=model:Customer"/>
person Arlo    schedule 29.07.2020