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


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

В следующем примере показано, как устранить исключение 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.

См. также