0

在 ReactiveUI 中,我在某个时间点运行此代码:

const string template = "<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:routing='using:ReactiveUI.Routing'>" +
    "<routing:ViewModelViewHost ViewModel=\"{Binding}\" VerticalContentAlignment=\"Stretch\" HorizontalContentAlignment=\"Stretch\" IsTabStop=\"False\" />" +
"</DataTemplate>";

var theTemplate = XamlReader.Load(template);

在其他平台上,这很好用(xmlns声明当然不同),但在 {WinRT / Metro / Windows Store} 上,这会引发未指定错误:

WinRT information: The type 'ViewModelViewHost' was not found. [Line: 1 Position: 253]

扭曲

但是,如果您在页面上包含虚拟资源:

<Page.Resources>
    <DataTemplate x:Name="Foo">
        <routing:ViewModelViewHost ViewModel="{Binding}" />
    </DataTemplate>
</Page.Resources>

......然后它的工作原理!是什么赋予了?

4

1 回答 1

3

“扭曲”让我认为这一定是因为应用程序没有正确的 XAML 元数据用于被实例化的类型 - 而不是使用反射来解析 WPF/Silverlight 等 XAML 文件中的类型,WinRT 使用代码生成来通过IXamlMetadataProvider接口解析(这里有一个不错的描述;听起来像你在做什么,另见后续)。添加引用会强制正确生成此元数据代码。如果是这种情况,您应该能够通过简单地将类型本身添加到某个未使用键下的资源中来实现相同的效果,而无需数据模板。

查看应用程序的“obj”目录,Visual Studio 会生成一个XamlTypeInfo.g.cs文件来实现IXamlMetadataProvider. 这应该包含失败类型的条目 - 如果您添加了虚拟引用,则应该有实例化类型所需的完整详细信息。如果没有这个,我发现有可能对类型类型有一些引用,但信息不足 - 但这可以防止失败行为(在可能具有自定义元数据提供程序的依赖 DLL 中查找类型)。

除了在最终应用程序本身中添加对库类型的虚拟引用之外,我找到的唯一解决方案是将Bindable属性应用于类型。虽然这应该与 C++ 有关,但我发现这可以在 C# 中用于强制类型始终出现在为 XAML 类型元数据生成的代码中。

于 2013-02-28T15:30:49.097 回答