Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Een verzameling die effectief kan worden gebonden aan een besturingselement voor XAML-items wordt een waarneembare verzameling genoemd. Dit idee is gebaseerd op het softwareontwerppatroon dat bekend staat als het waarnemerspatroon. In dit onderwerp wordt beschreven hoe u waarneembare verzamelingen implementeert in C++/WinRT-en hoe u besturingselementen voor XAML-items aan deze items koppelt (zie Gegevensbinding).
Als u dit onderwerp wilt volgen, raden we u aan eerst het project te maken dat wordt beschreven in XAML-besturingselementen; binden aan een C++/WinRT-eigenschap. In dit onderwerp voegt u meer code toe aan dat project en voegt deze toe aan de concepten die in dat onderwerp worden uitgelegd.
Belangrijk
Zie API's gebruiken met C++/WinRT en API's maken met C++/WinRTvoor essentiƫle concepten en termen die ondersteuning bieden bij uw inzicht in hoe u runtimeklassen met C++/WinRT kunt gebruiken en ontwerpen.
Wat betekenen en als waarneembaren voor een verzameling?
Als een runtimeklasse die een verzameling vertegenwoordigt, ervoor kiest om de IObservableVector<T>::VectorChanged gebeurtenis te genereren wanneer een element eraan wordt toegevoegd of verwijderd, is de runtimeklasse een waarneembare verzameling. Een XAML-itembesturingselement kan deze gebeurtenissen binden en verwerken door de bijgewerkte verzameling op te halen en vervolgens bij te werken om de huidige elementen weer te geven.
Opmerking
Zie voor informatie over het installeren en gebruiken van de C++/WinRT Visual Studio-extensie (VSIX) en het NuGet-pakket (dat samen projectsjabloon en build-ondersteuning biedt), Visual Studio-ondersteuning voor C++/WinRT-.
Een BookSkus verzameling toevoegen aan BookstoreViewModel
In XAML-besturingselementen; binden aan een C++/WinRT-eigenschap, hebben we een eigenschap van het type BookSku toegevoegd aan ons hoofdweergavemodel. In deze stap gebruiken we de winrt::single_threaded_observable_vector factory-functiesjabloon om ons te helpen bij het implementeren van een waarneembare verzameling BookSku- op hetzelfde weergavemodel.
Declareer een nieuwe eigenschap in BookstoreViewModel.idl.
// BookstoreViewModel.idl
...
runtimeclass BookstoreViewModel
{
BookSku BookSku{ get; };
Windows.Foundation.Collections.IObservableVector<BookSku> BookSkus{ get; };
}
...
Belangrijk
Binding met een verzameling met C++/WinRT is iets genuanceerder dan met C#. Houd er rekening mee dat in de bovenstaande MIDL 3.0-vermelding het type van de eigenschap BookSkusIObservableVector van BookSkuis. In de volgende sectie van dit onderwerp koppelen we de itemsbron van een ListBox- aan BookSkus-. Een keuzelijst is een besturingselement voor items en om de eigenschap ItemsControl.ItemsSource in te stellen, moet u deze instellen op een waarde van het type IObservableVectorof IVector, of van een interoperabiliteitstype zoals IBindableObservableVector. Anders zal {x:Bind}E_INVALIDARG genereren, en {Binding} zal stilletjes falen.
Waarschuwing
De code die in dit onderwerp wordt weergegeven, is van toepassing op C++/WinRT versie 2.0.190530.8 of hoger. Als u een eerdere versie gebruikt, moet u enkele kleine aanpassingen aanbrengen in de weergegeven code. Wijzig in de bovenstaande MIDL 3.0-lijst de eigenschap BookSkus in IObservableVector van IInspectable. En gebruik vervolgens ook IInspectable (in plaats van BookSku) in uw implementatie.
Opslaan en bouwen. Kopieer de accessor-stubs uit BookstoreViewModel.h en BookstoreViewModel.cpp in de map \Bookstore\Bookstore\Generated Files\sources (zie het vorige onderwerp, XAML-besturingselementen; bind aan een C++/WinRT-eigenschap). Implementeer deze accessor-stubs zoals deze.
// BookstoreViewModel.h
...
struct BookstoreViewModel : BookstoreViewModelT<BookstoreViewModel>
{
BookstoreViewModel();
Bookstore::BookSku BookSku();
Windows::Foundation::Collections::IObservableVector<Bookstore::BookSku> BookSkus();
private:
Bookstore::BookSku m_bookSku{ nullptr };
Windows::Foundation::Collections::IObservableVector<Bookstore::BookSku> m_bookSkus;
};
...
// BookstoreViewModel.cpp
...
BookstoreViewModel::BookstoreViewModel()
{
m_bookSku = winrt::make<Bookstore::implementation::BookSku>(L"Atticus");
m_bookSkus = winrt::single_threaded_observable_vector<Bookstore::BookSku>();
m_bookSkus.Append(m_bookSku);
}
Bookstore::BookSku BookstoreViewModel::BookSku()
{
return m_bookSku;
}
Windows::Foundation::Collections::IObservableVector<Bookstore::BookSku> BookstoreViewModel::BookSkus()
{
return m_bookSkus;
}
...
Een ListBox binden aan de eigenschap BookSkus
Open MainPage.xaml, die de XAML-opmaak voor onze hoofdgebruikersinterfacepagina bevat. Voeg de volgende markeringen toe binnen dezelfde StackPanel- als de Knop.
<ListBox ItemsSource="{x:Bind MainViewModel.BookSkus}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="local:BookSku">
<TextBlock Text="{x:Bind Title, Mode=OneWay}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
Voeg in MainPage.cppeen coderegel toe aan de Klik op gebeurtenis-handler om een boek toe te voegen aan de verzameling.
// MainPage.cpp
...
void MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
MainViewModel().BookSku().Title(L"To Kill a Mockingbird");
MainViewModel().BookSkus().Append(winrt::make<Bookstore::implementation::BookSku>(L"Moby Dick"));
}
...
Bouw nu het project en voer het uit. Klik op de knop om de Click event-handler uit te voeren. We hebben gezien dat de implementatie van Toevoegen een gebeurtenis genereert om de gebruikersinterface te laten weten dat de verzameling is gewijzigd; en de Keuzelijst de verzameling opnieuw opvraagt om een eigen items waarde bij te werken. Net als voorheen verandert de titel van een van de boeken; en deze titelwijziging wordt zowel op de knop als in de keuzelijst weergegeven.