Udostępnij przez


Przykład: obsługa wyjątków podczas wiązania danych

W poniższym przykładzie pokazano, jak rozwiązać wyjątek MissingMetadataException zgłaszany, gdy aplikacja skompilowana za pomocą łańcucha narzędziowego platformy .NET Native próbuje wiązać dane. Oto informacje o wyjątku:

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

Oto powiązany stos wywołań:

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

Co robi aplikacja?

Podstawą stosu są ramki z przestrzeni nazw Windows.UI.Xaml, które wskazują, że aparat renderowania XAML jest uruchomiony. Użycie PropertyInfo.GetValue metody wskazuje oparte na odbiciu wyszukiwanie wartości właściwości na typie, którego metadane zostały usunięte.

Pierwszym krokiem we wdrożeniu dyrektywy metadanych jest dodanie serialize metadanych dla typu, aby wszystkie jego właściwości były dostępne.

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

Czy jest to izolowany przypadek?

W tym scenariuszu, jeśli wiązanie danych ma niekompletne metadane dla jednego ViewModel, możliwe, że dotyczy to także innych. Jeśli kod jest ustrukturyzowany w sposób, w jaki modele widoku aplikacji znajdują się w App.ViewModels przestrzeni nazw, można użyć bardziej ogólnej dyrektywy środowiska uruchomieniowego:

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

Czy kod może zostać przepisany, aby nie używał odbicia?

Ponieważ powiązanie danych intensywnie wykorzystuje odbijanie, zmiana kodu w celu uniknięcia odbijania jest niewykonalna.

Istnieją jednak sposoby określenia ViewModel, dotyczące strony XAML, aby łańcuch narzędzi mógł skojarzyć powiązania właściwości z właściwym typem podczas kompilacji i przechowywać metadane bez użycia dyrektywy środowiska uruchomieniowego. Można na przykład zastosować atrybut Windows.UI.Xaml.Data.BindableAttribute do właściwości. Powoduje to wygenerowanie wymaganych informacji o wyszukiwaniu przez kompilator XAML i uniknięcie wymagania dyrektywy środowiska uruchomieniowego w pliku Default.rd.xml.

Zobacz także