等同于 UWP 中的 x:Type
Equivalent of x:Type in UWP
我有这个class:
public class EditorKey
{
public Type TargetType { get; set; }
public DataTemplate Template { get; set; }
}
现在,我想在 XAML 中创建此 class 的一个实例。由于在 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>
运行 这个,我得到一个运行时异常:
无法从文本 'model:Customer' 创建 'App8.EditorKey'。
如何将字符串映射到实际类型?
在 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"/>
我有这个class:
public class EditorKey
{
public Type TargetType { get; set; }
public DataTemplate Template { get; set; }
}
现在,我想在 XAML 中创建此 class 的一个实例。由于在 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>
运行 这个,我得到一个运行时异常:
无法从文本 'model:Customer' 创建 'App8.EditorKey'。
如何将字符串映射到实际类型?
在 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"/>