XAML-elemek vezérlői; kötés C++/WinRT-gyűjteményhez

Az XAML-elemek vezérlőihez hatékonyan kötődő gyűjteményeket megfigyelhető gyűjteménynek nevezzük. Ez az ötlet a megfigyelői mintaként ismert szoftvertervezési mintán alapul. Ez a témakör bemutatja, hogyan valósíthat meg megfigyelhető gyűjteményeket a C++/WinRT rendszerben, és hogyan kötheti hozzájuk az XAML-elemek vezérlőit (a háttérinformációkért lásd : Adatkötés).

Ha követni szeretné ezt a témakört, akkor javasoljuk, hogy először hozza létre az XAML-vezérlőkben leírt projektet; kötést egy C++/WinRT tulajdonsághoz. Ez a témakör további kódot ad hozzá a projekthez, és hozzáadja a témakörben ismertetett fogalmakat.

Fontos

Azokat az alapvető fogalmakat és kifejezéseket, amelyek támogatják a futtatókörnyezeti osztályok C+++/WinRT használatával történő felhasználásának és szerkesztésének megértését, olvassa el az API-k használata c++/WinRT-lel és Szerzői API-k c++/WinRT használatával című témakört.

Mit jelent a megfigyelhetőség egy gyűjtemény esetében?

Ha egy gyűjteményt képviselő futtatókörnyezeti osztály az IObservableVector<T>::VectorChanged eseményt választja, amikor hozzáad vagy eltávolít egy elemet, akkor a futásidejű osztály megfigyelhető gyűjtemény. Az XAML-elemek vezérlői a frissített gyűjtemény beolvasásával és az aktuális elemek megjelenítésével képesek ezekhez az eseményekhez kapcsolódni és kezelni őket.

Note

A C++/WinRT Visual Studio bővítmény (VSIX) és a NuGet-csomag telepítésével és használatával kapcsolatos információkért (amelyek együttesen nyújtanak projektsablont és buildtámogatást) lásd Visual Studio C++/WinRT támogatását.

BookSkus-gyűjtemény hozzáadása a BookstoreViewModelhez

Az XAML-vezérlőkben, amelyek egy C++/WinRT tulajdonsághoz kötődnek, hozzáadtunk egy BookSku típusú tulajdonságot a fő nézetmodellhez. Ebben a lépésben a winrt::single_threaded_observable_vector gyári függvénysablont fogjuk használni, hogy segítsen a BookSku megfigyelhető gyűjteményének implementálásában ugyanabban a nézetmodellben.

Deklaráljon egy új tulajdonságot a(z) BookstoreViewModel.idl elemben.

// BookstoreViewModel.idl
...
runtimeclass BookstoreViewModel
{
    BookSku BookSku{ get; };
    Windows.Foundation.Collections.IObservableVector<BookSku> BookSkus{ get; };
}
...

Fontos

A C++/WinRT-et tartalmazó gyűjteményhez való kötés kissé árnyaltabb, mint a C# esetén. A fenti MIDL 3.0-s listaelemben vegye figyelembe, hogy a BookSkus tulajdonság típusa a BookSkuIObservableVector tulajdonsága. A témakör következő szakaszában a ListBox elemforrását a BookSkushoz kötjük. A listamező egy elemeket tartalmazó vezérlő, és az ItemsControl.ItemsSource tulajdonság helyes beállításához olyan értékre kell állítani, amelynek típusa IObservableVector, IVector, vagy egy interop-kompatibilis típus, például IBindableObservableVector. Ellenkező esetben a {x:Bind} az E_INVALIDARG hibát adja, és a {Binding} csendben meghiúsul.

Warning

A jelen témakörben bemutatott kód a C++/WinRT 2.0.190530.8-s vagy újabb verziójára vonatkozik. Ha egy korábbi verziót használ, akkor néhány apró módosítást kell elvégeznie a megjelenített kódon. A fenti MIDL 3.0-s listaelemben módosítsa a BookSkus tulajdonságot az IInspectableIObservableVector elemére. Ezután használja az IInspectablet ( a BookSku helyett) a megvalósításban is.

Mentés és létrehozás. Másolja át az elérőtag-metódusok csonkjait a(z) BookstoreViewModel.h és BookstoreViewModel.cpp elemből a(z) \Bookstore\Bookstore\Generated Files\sources mappába (további részletekért lásd az előző témakört: XAML-vezérlők; kötés C++/WinRT-tulajdonsághoz). Hajtsa végre az ilyen kiegészítő csonkokat.

// 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;
}
...

ListBox kötése a BookSkus tulajdonsághoz

Nyissa meg a MainPage.xamlfájlt, amely tartalmazza a fő felhasználói felület oldalának XAML jelölését. Adja hozzá a következő korrektúrát ugyanabban a StackPanelben , mint a gomb.

<ListBox ItemsSource="{x:Bind MainViewModel.BookSkus}">
    <ItemsControl.ItemTemplate>
        <DataTemplate x:DataType="local:BookSku">
            <TextBlock Text="{x:Bind Title, Mode=OneWay}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ListBox>

A MainPage.cpp részben adjon hozzá egy kódsort a Click eseménykezelőhöz, hogy egy könyvet adjon a gyűjteményhez.

// 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"));
}
...

Most építse fel és futtassa a projektet. Kattintson a gombra a Click eseménykezelő végrehajtásához. Láttuk, hogy a Hozzáfűzés megvalósítása eseményt hoz létre, amely tudatja a felhasználói felülettel, hogy a gyűjtemény megváltozott; és a ListBox újra lekérdezi a gyűjteményt a saját Elemek értékének frissítéséhez. Ahogy korábban, az egyik könyv címe is megváltozik; és ez a címváltozás a gombon és a listamezőben is megjelenik.

Fontos API-k