Поделиться через


Пример: Обработка исключений при привязке данных

В следующем примере показано, как устранить исключение MissingMetadataException , которое возникает при компиляции приложения с цепочкой инструментов .NET Native, пытается привязать данные. Ниже приведены сведения об исключении:

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.

См. также