Contoh: Menangani Pengecualian Saat Mengikat Data

Contoh berikut menunjukkan cara mengatasi pengecualian MissingMetadataException yang dilemparkan saat aplikasi yang dikompilasi dengan rantai alat .NET Native mencoba mengikat data. Berikut adalah informasi pengecualian:

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

Berikut adalah tumpukan panggilan terkait:

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

Apa yang dilakukan aplikasi?

Di dasar tumpukan, bingkai dari namespace Windows.UI.Xaml menunjukkan bahwa mesin penyajian XAML sedang berjalan. Penggunaan metode PropertyInfo.GetValue menunjukkan pencarian nilai properti menggunakan refleksi pada tipe yang metadatanya dihapus.

Langkah pertama dalam menyediakan arahan metadata adalah menambahkan serialize metadata untuk jenis sehingga semua propertinya dapat diakses:

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

Apakah ini kasus terisolasi?

Dalam skenario ini, jika pengikatan data memiliki metadata yang tidak lengkap untuk satu ViewModel, mungkin juga terjadi untuk yang lain. Jika kode disusun sedemikian rupa sehingga model tampilan aplikasi semuanya berada di namespace App.ViewModels, Anda dapat menggunakan perintah runtime yang lebih umum.

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

Bisakah kode ditulis ulang untuk tidak menggunakan pantulan?

Karena pengikatan data memerlukan banyak refleksi, perubahan kode untuk menghindari refleksi tidak memungkinkan.

Namun, ada cara untuk menentukan ViewModel ke halaman XAML sehingga rantai alat dapat mengaitkan pengikatan properti dengan jenis yang benar pada waktu kompilasi dan menyimpan metadata tanpa menggunakan arahan runtime. Misalnya, Anda dapat menerapkan Windows.UI.Xaml.Data.BindableAttribute atribut pada properti. Hal ini menyebabkan pengkompilasi XAML menghasilkan informasi pencarian yang diperlukan dan menghindari memerlukan arahan runtime dalam file Default.rd.xml.

Lihat juga