Esempio: gestione delle eccezioni durante il data bindingExample: Handling Exceptions When Binding Data

Nota

In questo argomento si fa riferimento a .NET Native Developer Preview, ovvero la versione preliminare del software,This topic refers to the .NET Native Developer Preview, which is pre-release software. che è possibile scaricare dal sito Web di Microsoft Connect (è necessaria la registrazione).You can download the preview from the Microsoft Connect website (requires registration).

L'esempio seguente illustra come risolvere un'eccezione MissingMetadataException generata quando un'app compilata con la catena di strumenti .NET Native.NET Native prova ad associare i dati.The following example shows how to resolve a MissingMetadataException exception that is thrown when an app compiled with the .NET Native.NET Native tool chain tries to bind data. Queste sono le informazioni sull'eccezione:Here’s the exception information:

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

Questo è lo stack di chiamate associato:Here's the associated call stack:

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  

Che cosa stava eseguendo l'app?What was the app doing?

Alla base dello stack, i frame dello spazio dei nomi Windows.UI.Xaml indicano che il motore di rendering XAML era in esecuzione.At the base of the stack, frames from the Windows.UI.Xaml namespace indicate that the XAML rendering engine was running. L'uso del metodo PropertyInfo.GetValue indica una ricerca basata su reflection del valore di una proprietà sul tipo di cui sono stati rimossi i metadati.The use of the PropertyInfo.GetValue method indicates a reflection-based lookup of a property’s value on the type whose metadata was removed.

Il primo passaggio per la fornitura di una direttiva di metadati consiste nell'aggiunta di metadati serialize per il tipo che ne rende accessibili le proprietà:The first step in providing a metadata directive would be to add serialize metadata for the type so that its properties are all accessible:

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

Si tratta di un caso isolato?Is this an isolated case?

In questo scenario, se il data binding contiene metadati incompleti per ViewModel, potrebbe contenerne anche per altri.In this scenario, if data binding has incomplete metadata for one ViewModel, it may for others, too. Se il codice è strutturato in modo che i modelli di visualizzazione dell'app siano tutti nello spazio dei nomi App.ViewModels, è possibile usare una direttiva di runtime più generale:If the code is structured in a way that the app’s view models are all in the App.ViewModels namespace, you could use a more general runtime directive:

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

Il codice può essere riscritto per escludere l'uso della reflection?Could the code be rewritten to not use reflection?

Il data binding ha un elevato livello di reflection, pertanto la modifica del codice per impedire la reflection non è consentita.Because data binding is reflection-intensive, changing the code to avoid reflection isn’t feasible.

Tuttavia, sono disponibili dei metodi per specificare ViewModel nella pagina XAML in modo che la catena di strumenti possa associare le associazioni di proprietà al tipo corretto durante la compilazione e mantenere i metadati senza usare una direttiva di runtime.However, there are ways to specify the ViewModel to the XAML page so that the tool chain can associate property bindings with the correct type at compile time and keep the metadata without using a runtime directive. È ad esempio possibile applicare l'attributo Windows.UI.Xaml.Data.BindableAttribute alle proprietà.For example, you could apply the Windows.UI.Xaml.Data.BindableAttribute attribute on properties. In questo modo il compilatore XAML genera le informazioni di ricerca necessarie ed evita la richiesta di una direttiva di runtime nel file Default.rd.xml.This causes the XAML compiler to generate the required lookup information and avoids requiring a runtime directive in the Default.rd.xml file.

Vedere ancheSee Also

IntroduzioneGetting Started
Esempio: Risoluzione dei problemi di programmazione dinamicaExample: Troubleshooting Dynamic Programming