Compartir a través de


Ejemplo: Manejo de excepciones al vincular datos

En el ejemplo siguiente se muestra cómo resolver un MissingMetadataException excepción que se produce cuando una aplicación compilada con la cadena de herramientas nativa de .NET intenta enlazar datos. Esta es la información de excepción:

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

Aquí está la pila de llamadas asociada:

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

¿Qué hacía la aplicación?

En la base de la pila, los cuadros del espacio de nombres Windows.UI.Xaml indican que el motor de representación XAML estaba en ejecución. El uso del método PropertyInfo.GetValue indica una búsqueda basada en la reflexión del valor de una propiedad en el tipo cuyos metadatos se quitaron.

El primer paso para proporcionar una directiva de metadatos sería agregar serialize metadatos para el tipo para que todas sus propiedades sean accesibles:

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

¿Este es un caso aislado?

En este escenario, si el enlace de datos tiene metadatos incompletos para un ViewModel, también podría tenerlos para otros. Si el código está estructurado de forma que los modelos de vista de la aplicación estén todos en el espacio de nombres App.ViewModels, puede usar una directiva de tiempo de ejecución más general:

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

¿Se podría volver a escribir el código para no usar la reflexión?

Dado que el enlace de datos consume mucha reflexión, no es factible cambiar el código para evitar la reflexión.

Sin embargo, hay maneras de especificar el ViewModel en la página XAML para que la cadena de herramientas pueda asociar enlaces de propiedades con el tipo correcto en tiempo de compilación y mantener los metadatos sin usar una directiva en tiempo de ejecución. Por ejemplo, puede aplicar el atributo Windows.UI.Xaml.Data.BindableAttribute en las propiedades. Esto hace que el compilador XAML genere la información de búsqueda necesaria y evite requerir una directiva en tiempo de ejecución en el archivo Default.rd.xml.

Consulte también