示例:处理绑定数据时出现的异常

以下实例演示了如何解决当一个通过 .NET Native 工具链编译的应用试图绑定数据时引发的 MissingMetadataException 异常。 以下是有关异常的信息:

This operation cannot be carried out as metadata for the following type was removed for performance reasons:
App.ViewModels.MainPageVM

以下是相关的调用堆栈:

Reflection::Execution::ReflectionDomainSetupImplementation.CreateNonInvokabilityException+0x238
Reflection::Core::ReflectionDomain.CreateNonInvokabilityException+0x2e
Reflection::Core::Execution::ExecutionEnvironment.+0x316
System::Reflection::Runtime::PropertyInfos::RuntimePropertyInfo.GetValue+0x1cb
System::Reflection::PropertyInfo.GetValue+0x22
System::Runtime::InteropServices::WindowsRuntime::CustomPropertyImpl.GetValue+0x42
App!$66_Interop::McgNative.Func_IInspectable_IInspectable+0x158
App!$66_Interop::McgNative::__vtable_Windows_UI_Xaml_Data__ICustomProperty.GetValue__STUB+0x46
Windows_UI_Xaml!DirectUI::PropertyProviderPropertyAccess::GetValue+0x3f
Windows_UI_Xaml!DirectUI::PropertyAccessPathStep::GetValue+0x31
Windows_UI_Xaml!DirectUI::PropertyPathListener::ConnectPathStep+0x113

该应用在执行什么操作?

在堆栈的底部,Windows.UI.Xaml 命名空间中的帧指示 XAML 呈现引擎正在运行。 对 PropertyInfo.GetValue 方法的使用指示对元数据遭到删除的类型的属性值进行的基于反射的查找。

第一步是提供一个元数据指令,将其添加到该类型的 serialize 元数据,使其所有属性都可访问:

<Type Name="App.ViewModels.MainPageVM" Serialize="Required Public" />

这是一个孤立情形吗?

在此情况下,如果数据绑定拥有一个 ViewModel 的不完整元数据,它对于其他模型可能也是如此。 如果代码的结构方式使得该应用的查看模型都位于 App.ViewModels 命名空间,你可以使用一个更一般的运行时指令:

<Namespace Name="App.ViewModels " Serialize="Required Public" />

代码能够重新,改为不使用反射吗?

因为数据绑定是反射密集型的,更改代码以避免反射是不可行的。

然而,有几种方法可以指定 ViewModel 到 XAML 页面,从而让工具链在汇编时间可以将属性绑定与正确的类型关联起来并保存元数据,而不必使用运行时指令。 例如,可以对属性应用 Windows.UI.Xaml.Data.BindableAttribute 属性。 这会使得 XAML 编译器生成所需的查找信息并避免在 Default.rd.xml 文件中要求一个运行时指令。

另请参阅