Esempio: gestione delle eccezioni durante il data binding

L'esempio seguente illustra come risolvere un'eccezione MissingMetadataException generata quando un'app compilata con la catena di strumenti .NET Native tenta di associare i dati. Ecco le informazioni sull'eccezione:

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:

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

Quale attività stava eseguendo l'app?

Alla base dello stack, i frame dello Windows.UI.Xaml spazio dei nomi indicano che il motore di rendering XAML era in esecuzione. L'uso del PropertyInfo.GetValue metodo indica una ricerca basata su reflection del valore di una proprietà sul tipo i cui metadati sono stati rimossi.

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à:

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

Si tratta di un caso isolato?

In questo scenario, se il data binding contiene metadati incompleti per ViewModel, potrebbe contenerne anche per altri. Se il codice è strutturato in modo che i modelli di visualizzazione dell'app siano tutti nello spazio dei App.ViewModels nomi, è possibile usare una direttiva di runtime più generale:

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

Il codice può essere riscritto per escludere l'uso della reflection?

Poiché il data binding è a elevato utilizzo di reflection, la modifica del codice per evitare la reflection non è fattibile.

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. Ad esempio, è possibile applicare l'attributo Windows.UI.Xaml.Data.BindableAttribute alle proprietà. 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.

Vedi anche