Megosztás a következőn keresztül:


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 mintanevű szoftvertervezési mintán alapul. Ez a témakör bemutatja, hogyan valósíthat meg megfigyelhető gyűjteményeket C++/WinRT, és hogyan kötheti hozzájuk az XAML-elemek vezérlőit (a háttérinformációkért lásd Adatkötési).

Ha ezt a témakört is követni szeretné, javasoljuk, hogy először hozza létre a XAML-vezérlőkben leírt projektet; kötés 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

Az alapvető fogalmakért és kifejezésekért, 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, tekintse meg API-k használata C++/WinRT és Szerzői API-k C++/WinRThasználatával című témakört.

Mit jelent a megfigyelhető egy gyűjtemény számára?

Ha egy gyűjteményt képviselő futtatókörnyezeti osztály úgy dönt, hogy eseményt vált ki mindig, amikor elemet adnak hozzá vagy eltávolítanak, akkor az IObservableVector<T>::VectorChanged egy 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.

Megjegyzés:

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 támogatása a C++/WinRT.

Adj hozzá egy BookSkus gyűjteményt a BookstoreViewModel-hoz

XAML-vezérlők esetén aC++/WinRT tulajdonsághoz történő kötésnél hozzáadtunk egy BookSku típusú tulajdonságot a fő nézetmodellhez. Ebben a lépésben a winrt::single_threaded_observable_vector factory függvénysablont használjuk, amely segít a BookSku megfigyelhető gyűjteményének megvalósításában ugyanazon a nézetmodellen.

Adjon meg egy új tulajdonságot a BookstoreViewModel.idl-ban.

// 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 felsorolásban vegye figyelembe, hogy a BookSkus tulajdonság típusa IObservableVectorBookSku. A témakör következő szakaszában a ListBox elemek forrását fogjuk a BookSkus-hoz kötni. A lista mező egy elemvezérlő, és a ItemsControl.ItemsSource tulajdonság helyes beállításához a következő típusú értékre kell állítania: IObservableVector, vagy IVector, vagy egy interoperabilitási típus, mint például a IBindableObservableVector. Ellenkező esetben a {x:Bind}E_INVALIDARG-ot fog generálni, és a {Binding} csendesen meghiúsul.

Figyelmeztetés

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 felsorolásban módosítsa a BookSkus tulajdonságot IObservableVectorIInspectable. Ezután használja a IInspectable-et (a BookSkuhelyett) a megvalósításában is.

Mentés és létrehozás. Másolja a metóduscsonkokat a BookstoreViewModel.h és BookstoreViewModel.cpp elemekről a \Bookstore\Bookstore\Generated Files\sources mappába. További részletekért lásd az előző témakört: XAML-vezérlők, és hogyan kössön 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ő jelölést ugyanabban a StackPanel-ben, 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, adjon hozzá egy kódsort a kattintási eseménykezelőhöz egy könyv hozzáadása érdekében 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 hozza létre és futtassa a projektet. Kattintson a gombra a Click eseménykezelő végrehajtásához. Láttuk, hogy a Append 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, hogy frissítse a saját Elemek értékét. 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