Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Uma coleção observável que pode ser efetivamente vinculada a um controlo de itens XAML é conhecida como uma coleção. Esta ideia é baseada no padrão de design de software conhecido como padrão de observador . Este tópico mostra como implementar coleções observáveis em C++/WinRT e como vincular controles de itens XAML a eles (para obter informações detalhadas, consulte de vinculação de dados ).
Se você quiser acompanhar este tópico, recomendamos que você primeiro crie o projeto descrito em controles XAML; vincular a uma propriedade C++/WinRT. Este tópico adiciona mais código a esse projeto e adiciona aos conceitos explicados nesse tópico.
Importante
Para obter conceitos e termos essenciais que apoiam a sua compreensão de como consumir e criar classes em tempo de execução com C++/WinRT, consulte Consumir APIs com C++/WinRT e Criar APIs com C++/WinRT.
O que significa observável para uma coleção?
Se uma classe de tempo de execução que representa uma coleção optar por disparar o evento IObservableVector<T>::VectorChanged sempre que um elemento for adicionado a ela ou removido dela, então a classe de tempo de execução é uma coleção observável. Um controle de itens XAML pode vincular e manipular esses eventos recuperando a coleção atualizada e, em seguida, atualizando-se para mostrar os elementos atuais.
Observação
Para obter informações sobre como instalar e usar o C++/WinRT Visual Studio Extension (VSIX) e o pacote NuGet (que, juntos, fornecem suporte a modelo de projeto e compilação), consulte suporte do Visual Studio para C++/WinRT.
Adicione uma coleção de BookSkus a BookstoreViewModel
Em controles XAML, vincular a uma propriedade C++/WinRT, adicionámos uma propriedade do tipo BookSku ao nosso modelo de vista principal. Nesta etapa, usaremos o template de função de fábrica winrt::single_threaded_observable_vector para nos ajudar a implementar uma coleção observável de BookSku no mesmo modelo de exibição.
Declare uma nova propriedade em BookstoreViewModel.idl.
// BookstoreViewModel.idl
...
runtimeclass BookstoreViewModel
{
BookSku BookSku{ get; };
Windows.Foundation.Collections.IObservableVector<BookSku> BookSkus{ get; };
}
...
Importante
A vinculação a uma coleção com C++/WinRT é um pouco mais matizada do que com C#. Na listagem MIDL 3.0 acima, observe que o tipo da propriedade BookSkus é IObservableVector de BookSku. Na próxima seção deste tópico, vincularemos a origem dos itens de um ListBox ao BookSkus. Uma caixa de listagem é um controle de itens e, para definir corretamente a propriedade ItemsControl.ItemsSource, você precisa defini-la como um valor do tipo IObservableVector, ou IVector, ou de um tipo de interoperabilidade, como IBindableObservableVector. Caso contrário, {x:Bind} gerará E_INVALIDARG e {Binding} falhará silenciosamente.
Advertência
O código mostrado neste tópico aplica-se ao C++/WinRT versão 2.0.190530.8 ou posterior. Se você estiver usando uma versão anterior, precisará fazer alguns pequenos ajustes no código mostrado. Na listagem MIDL 3.0 acima, altere a propriedade BookSkus para IObservableVector de IInspectable. Em seguida, use IInspectable (em vez de BookSku) na sua implementação também.
Salve e construa. Copie os stubs de acessador de BookstoreViewModel.h e BookstoreViewModel.cpp na pasta \Bookstore\Bookstore\Generated Files\sources (para obter mais detalhes, consulte o tópico anterior, controles XAML; vincular a uma propriedade C++/WinRT). Implemente esses stubs de acessor como este.
// 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;
}
...
Associar uma ListBox à propriedade BookSkus
Abra o MainPage.xaml, que contém a marcação XAML para a nossa página principal da interface de utilizador. Adicione a seguinte marcação dentro do mesmo StackPanel que o Button.
<ListBox ItemsSource="{x:Bind MainViewModel.BookSkus}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="local:BookSku">
<TextBlock Text="{x:Bind Title, Mode=OneWay}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
No MainPage.cpp, adicione uma linha de código ao manipulador de eventos Click para acrescentar um livro à coleção.
// 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"));
}
...
Agora compile e execute o projeto. Clique no botão para executar o manipulador de eventos Click. Vimos que a implementação de Append gera um evento para informar à interface do usuário que a coleção foi alterada; e o ListBox consulta novamente a coleção para atualizar seu próprio Items valor. Tal como antes, o título de um dos livros muda; e essa mudança de título é refletida no botão e na caixa de listagem.