ovládací prvky položek XAML; svázání s kolekcí C++/WinRT

Kolekce, která může být efektivně vázána na ovládací prvek položek XAML, se označuje jako pozorovatelná kolekce. Tato myšlenka je založená na vzoru návrhu softwaru známém jako vzor pozorovatele. Toto téma ukazuje, jak implementovat pozorovatelné kolekce v jazyce C++/WinRT a jak s nimi svázat ovládací prvky položek XAML (informace o pozadí najdete v tématu Datová vazba).

Pokud chcete postupovat podle tohoto tématu, doporučujeme nejprve vytvořit projekt, který je popsaný v ovládacích prvcích XAML, a vytvořit vazbu na vlastnost C++/WinRT. Toto téma přidá do tohoto projektu další kód a přidá se do konceptů vysvětlených v tomto tématu.

Důležité

Základní koncepty a termíny, které podporují pochopení toho, jak využívat a vytvářet třídy modulu runtime pomocí C++/WinRT, najdete v tématu Využívání rozhraní API s rozhraními C++/WinRT a Author API s C++/WinRT.

Co znamená, že je kolekce pozorovatelná?

Pokud se třída modulu Runtime, která představuje kolekci, rozhodne vyvolat událost IObservableVector<T>::VectorChanged pokaždé, když je do ní prvek přidán nebo je z ní odebrán, pak je tato třída modulu Runtime pozorovatelnou kolekcí. Ovládací prvek položek XAML může svázat a zpracovat tyto události načtením aktualizované kolekce a následnou aktualizací tak, aby zobrazoval aktuální prvky.

Note

Informace o instalaci a použití rozšíření C++/WinRT Visual Studio (VSIX) a balíčku NuGet (které společně poskytují podporu šablony projektu a sestavení) najdete v tématu Visual Studio podpora pro C++/WinRT.

Přidání kolekce BookSkus do BookstoreViewModel

V ovládacích prvcích XAML; vazbu k vlastnosti C++/WinRT jsme do našeho hlavního modelu zobrazení přidali vlastnost typu BookSku . V tomto kroku použijeme šablonu tovární funkce winrt::single_threaded_observable_vector, která nám pomůže implementovat pozorovatelnou kolekci BookSku v témž modelu zobrazení.

Deklarujte novou vlastnost v souboru BookstoreViewModel.idl.

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

Důležité

Vazba na kolekci pomocí C++/WinRT je o něco složitější než v C#. Ve výše uvedeném výpisu MIDL 3.0 si všimněte, že typ vlastnosti BookSkus je IObservableVector typu BookSku. V další části tohoto tématu budeme svázat zdroje položek ListBox s BookSkus. Pole se seznamem je ovládací prvek pro položky a pro správné nastavení vlastnosti ItemsControl.ItemsSource je třeba ji nastavit na hodnotu typu IObservableVector, IVector nebo na propojovací typ, například IBindableObservableVector. Jinak {x:Bind} vygeneruje E_INVALIDARG a {Binding} tiše selže.

Warning

Kód uvedený v tomto tématu platí pro C++/WinRT verze 2.0.190530.8 nebo novější. Pokud používáte starší verzi, budete muset udělat několik dílčích úprav zobrazeného kódu. Ve výše uvedeném výpisu MIDL 3.0 změňte vlastnost BookSkus na IObservableVector typu IInspectable. A pak v implementaci použijte IInspectable (místo BookSku).

Uložte a sestavte. Zkopírujte stuby přístupových metod z BookstoreViewModel.h a BookstoreViewModel.cpp ve složce \Bookstore\Bookstore\Generated Files\sources (další podrobnosti najdete v předchozím tématu Ovládací prvky XAML; vazba na vlastnost C++/WinRT). Implementujte tyto zástupné procedury takhle.

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

Přivažte ovládací prvek ListBox k vlastnosti BookSkus

Otevřete MainPage.xaml, který obsahuje kód XAML pro naši hlavní stránku uživatelského rozhraní. Do stejného objektu StackPanel jako tlačítko přidejte následující kód.

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

Do MainPage.cppobslužné rutiny události Click přidejte řádek kódu pro připojení knihy do kolekce.

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

Nyní sestavte a spusťte projekt. Kliknutím na tlačítko spusťte obslužnou rutinu události Click . Viděli jsme, že implementace Append vyvolá událost, aby informovala uživatelské rozhraní o tom, že se kolekce změnila; a ListBox se znovu dotáže kolekce, aby aktualizoval vlastní hodnotu Items. Stejně jako předtím se název jedné knihy změní; a tato změna názvu se projeví jak na tlačítku, tak v seznamu.

Důležitá rozhraní API