Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bir XAML öğeleri denetimine etkili bir şekilde bağlanabilen koleksiyon, gözlemlenebilir koleksiyon olarak bilinir. Bu fikir, gözlemci deseni olarak bilinen yazılım tasarım desenini temel alır. Bu konu C ++/WinRT'de gözlemlenebilir koleksiyonların nasıl uygulanacağını ve XAML öğeleri denetimlerinin bunlara nasıl bağlanacağını gösterir (arka plan bilgileri için bkz . Veri bağlama).
Bu konuyu takip etmek istiyorsanız, önce XAML denetimlerinde açıklanan projeyi oluşturmanızı ve C++/WinRT özelliğine bağlamanızı öneririz. Bu konu, söz konusu projeye daha fazla kod ekler ve bu konuda açıklanan kavramlara ekler.
Önemli
C++/WinRT ile çalışma zamanı sınıflarını kullanma ve yazma hakkında bilginizi destekleyen temel kavramlar ve terimler için bkz. C++/WinRT ile API'leri kullanma ve C++/WinRT ile API'leri yazma.
Gözlemlenebilir bir koleksiyon için ne anlama gelir?
Bir koleksiyonu temsil eden bir çalışma zamanı sınıfı, bir öğe eklendiğinde veya kaldırıldığında IObservableVector<T>::VectorChanged olayını tetiklemeyi seçerse, çalışma zamanı sınıfı gözlemlenebilir bir koleksiyondur. XAML öğeleri denetimi, güncelleştirilmiş koleksiyonu alıp geçerli öğeleri gösterecek şekilde kendisini güncelleştirerek bu olaylara bağlanabilir ve bunları işleyebilir.
Note
C++/WinRT Visual Studio Uzantısını (VSIX) ve NuGet paketini (birlikte proje şablonu ve derleme desteği sağlayan) yükleme ve kullanma hakkında bilgi için bkz. C++/WinRT için Visual Studio desteği.
BookstoreViewModel'eBookSkus koleksiyonu ekleme
XAML denetimlerinde; C++/WinRT özelliğine bağlanın, ana görünüm modelimize BookSku türünde bir özellik ekledik. Bu adımda, aynı görünüm modelinde gözlemlenebilir bir BookSku koleksiyonu uygulamamıza yardımcı olması için winrt::single_threaded_observable_vector fabrika işlev şablonunu kullanacağız.
BookstoreViewModel.idl içinde yeni bir özellik tanımlayın.
// BookstoreViewModel.idl
...
runtimeclass BookstoreViewModel
{
BookSku BookSku{ get; };
Windows.Foundation.Collections.IObservableVector<BookSku> BookSkus{ get; };
}
...
Önemli
C++/WinRT ile bir koleksiyona bağlanmak, C# ile olduğundan biraz daha incedir. Yukarıdaki MIDL 3.0 listesinde BookSkus özelliğinin türünün IObservableVector of BookSku olduğuna dikkat edin. Bu konunun sonraki bölümünde ListBox'ın öğe kaynağını BookSkus'a bağlayacağız. Liste kutusu bir öğe denetimidir ve ItemsControl.ItemsSource özelliğini doğru ayarlamak için, bunu IObservableVector veya IVector türünde bir değere ya da IBindableObservableVector gibi birlikte çalışabilirlik türüne ayarlamanız gerekir. Aksi takdirde, {x:Bind}E_INVALIDARG oluşturur ve {Binding} sessizce başarısız olur.
Warning
Bu konuda gösterilen kod C++/WinRT sürüm 2.0.190530.8 veya üzeri için geçerlidir. Önceki bir sürümü kullanıyorsanız, gösterilen kodda bazı küçük ayarlamalar yapmanız gerekir. Yukarıdaki MIDL 3.0 listesinde BookSkus özelliğini IObservableVector of IInspectable olarak değiştirin. Ardından, uygulamanızda da IInspectable kullanın (BookSku yerine).
Kaydet ve derle.
\Bookstore\Bookstore\Generated Files\sources klasöründeki BookstoreViewModel.h ve BookstoreViewModel.cpp erişimci saplamalarını kopyalayın (daha fazla ayrıntı için önceki konuya bakın: XAML denetimleri; bir C++/WinRT özelliğine bağlama). Bu erişimci saplamalarını aşağıdaki gibi uygulayın.
// 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;
}
...
BookSkus özelliğine ListBox bağlama
ana kullanıcı arabirimi sayfamız için XAML işaretlemesini içeren MainPage.xamlaçın. Aşağıdaki işaretlemeyi Düğme ile aynı StackPanel içine ekleyin.
<ListBox ItemsSource="{x:Bind MainViewModel.BookSkus}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="local:BookSku">
<TextBlock Text="{x:Bind Title, Mode=OneWay}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
içinde MainPage.cppClick olay işleyicisine bir kod satırı ekleyerek koleksiyona bir kitap ekleyin.
// 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"));
}
...
Şimdi projeyi oluşturun ve çalıştırın. Click olay işleyicisini yürütmek için düğmeye tıklayın. Append uygulamasının kullanıcı arabirimine koleksiyonun değiştiğini bildirmek için bir olay oluşturduğunu gördük; ve ListBox kendi Items değerini güncelleştirmek için koleksiyonu yeniden sorgular. Daha önce olduğu gibi, kitaplardan birinin başlığı değişir; ve bu başlık değişikliği hem düğmeye hem de liste kutusuna yansıtılır.
Önemli API'ler
İlgili konular
Windows developer