Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.