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 informasi pengecualiannya:

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 ini?

Di dasar tumpukan, bingkai dari Windows.UI.Xaml namespace menunjukkan bahwa mesin penyajian XAML sedang berjalan. Penggunaan PropertyInfo.GetValue metode menunjukkan pencarian berbasis refleksi dari nilai properti pada jenis 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 untuk orang lain. Jika kode disusun dengan cara yang semuanya ada di App.ViewModels namespace layanan tampilan aplikasi, Anda dapat menggunakan arahan runtime yang lebih umum:

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

Bisakah kode ditulis ulang untuk tidak menggunakan pantulan?

Karena pengikatan data intensif terhadap refleksi, mengubah kode untuk menghindari pantulan tidak layak.

Namun, ada cara untuk menentukan ViewModel ke halaman XAML sehingga rantai alat dapat mengaitkan pengikatan properti dengan jenis yang benar pada waktu kompilasi dan mempertahankan 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