Aracılığıyla paylaş


Örnek: Verileri Bağlarken Özel Durumları İşleme

Aşağıdaki örnek, .NET Native araç zinciriyle derlenen bir uygulama verileri bağlamaya çalıştığında oluşan MissingMetadataException özel durumunun nasıl çözüleceğini gösterir. Özel durum bilgileri şunlardır:

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

İlişkili çağrı yığını aşağıdadır:

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

Uygulama ne yapıyordu?

Yığının tabanında, Windows.UI.Xaml ad alanından çerçeveler XAML işleme motorunun çalıştığını gösterir. PropertyInfo.GetValue yönteminin kullanılması, meta verileri kaldırılan türdeki bir özelliğin değerinin yansıma tabanlı aramasını gösterir.

Meta veri yönergesi sağlamanın ilk adımı, özelliklerinin tümünün erişilebilir olması için türü için serialize meta verileri eklemek olacaktır:

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

Bu yalıtılmış bir dava mı?

Bu senaryoda, veri bağlamada bir ViewModeliçin eksik meta veriler varsa, diğerleri için de olabilir. Kod, uygulamanın görünüm modellerinin tümü App.ViewModels ad alanında olacak şekilde yapılandırılmışsa, daha genel bir çalışma zamanı yönergesi kullanabilirsiniz:

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

Kod yansıma kullanmamak için yeniden yazılabilir mi?

Veri bağlama yoğun yansıma içerdiğinden, yansımayı önlemek için kodu değiştirmek uygun değildir.

Ancak, araç zincirinin derleme zamanında özellik bağlamalarını doğru türle ilişkilendirebilmesi ve meta verileri çalışma zamanı yönergesi kullanmadan koruyabilmesi için XAML sayfasına ViewModel belirtmenin yolları vardır. Örneğin, özelliklere Windows.UI.Xaml.Data.BindableAttribute özniteliğini uygulayabilirsiniz. Bu, XAML derleyicisinin gerekli arama bilgilerini oluşturmasına neden olur ve Default.rd.xml dosyasında çalışma zamanı yönergesi gerektirmekten kaçınıyor.

Ayrıca bakınız