相当于x:输入UWP

时间:2017-11-18 12:26:29

标签: c# .net xaml uwp markup-extensions

我有这堂课:

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>

运行它,我得到一个运行时异常:

无法创建&#39; App8.EditorKey&#39;来自文本&#39;模型:客户&#39;。

如何将字符串映射到实际的类型?

1 个答案:

答案 0 :(得分: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"/>