Besturingselementen voor XAML-items; binden aan een C++/WinRT-verzameling

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 voor achtergrondinformatie).

Als u dit onderwerp wilt volgen, raden we u aan eerst het project te maken dat wordt beschreven in XAML-besturingselementen; bindt 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 Author API's met C++/WinRT voor essentiële concepten en termen die ondersteuning bieden voor uw begrip van het gebruiken en schrijven van runtimeklassen met C++/WinRT.

Wat betekent waarneembaar voor een verzameling?

Als een runtimeklasse die een verzameling vertegenwoordigt, ervoor kiest om de IObservableVector<T>::VectorChanged-gebeurtenis te verhogen 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.

Note

Zie Visual Studio support for C++/WinRT voor informatie over het installeren en gebruiken van de Visual Studio-extensie (VSIX) en het NuGet-pakket voor C++/WinRT, die samen projectsjablonen en ondersteuning voor builds bieden.

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#. In de bovenstaande MIDL 3.0-vermelding moet u er rekening mee houden dat het type van de eigenschap BookSkusIObservableVector van BookSku is. In de volgende sectie van dit onderwerp koppelen we de itemsbron van een keuzelijst aan BookSkus. Een keuzelijst is een itembesturingselement en als u de eigenschap ItemsControl.ItemsSource correct wilt instellen, moet u deze instellen op een waarde van het type IObservableVector of IVector, of van een interoperabiliteitstype zoals IBindableObservableVector. Anders genereert {x:Bind}E_INVALIDARG en zal {Binding} stilzwijgend mislukken.

Warning

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-vermelding de eigenschap BookSkus in IObservableVector van IInspectable. En gebruik vervolgens ook IInspectable (in plaats van BookSku) in uw implementatie.

Opslaan en bouwen. Kopieer de accessorstubs van BookstoreViewModel.h en BookstoreViewModel.cpp uit de map \Bookstore\Bookstore\Generated Files\sources (zie voor meer informatie het vorige onderwerp: XAML-besturingselementen; binden 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 keuzelijst 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.cpp een coderegel toe aan de Click-eventhandler om een boek aan de verzameling toe te voegen.

// 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 gebeurtenisafhandelaar voor Klik uit te voeren. We hebben gezien dat de implementatie van Append een gebeurtenis genereert om de gebruikersinterface te laten weten dat de verzameling is gewijzigd; en de listbox voert een nieuwe query uit op de verzameling om de eigen waarde items 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.

Belangrijke API's