XAML 항목 컨트롤에 효과적으로 바인딩할 수 있는 컬렉션을 관찰 가능한 컬렉션이라고 합니다. 이 아이디어는 관찰자 패턴알려진 소프트웨어 디자인 패턴을 기반으로 합니다. 이 항목에서는 C++/WinRT에서 관찰 가능한 컬렉션을 구현하는 방법과 XAML 항목 컨트롤을 바인딩하는 방법을 보여 줍니다(배경 정보는 데이터 바인딩 참조).
이 항목과 함께 수행하려면 먼저 XAML 컨트롤에 설명된 프로젝트를 만드는 것이 좋습니다. C++/WinRT 속성바인딩합니다. 이 항목에서는 해당 프로젝트에 더 많은 코드를 추가하고 해당 항목에 설명된 개념에 추가합니다.
중요합니다
C++/WinRT를 사용하여 런타임 클래스를 소비 및 작성하는 방법에 대한 이해를 돕는 필수 개념과 용어에 대해서는 C++/WinRT를 사용하여 API 소비하기 및 C++/WinRT를 사용하여 API 작성하기를 참조하세요.
컬렉션에서 관찰 가능한은 무엇을 의미하나요?
컬렉션을 나타내는 런타임 클래스가 요소가 추가되거나 제거될 때마다 IObservableVector<T>::VectorChanged 이벤트를 발생하도록 선택하는 경우 런타임 클래스는 관찰 가능한 컬렉션입니다. XAML 항목 컨트롤은 업데이트된 컬렉션을 검색한 다음, 현재 요소를 표시하도록 자신을 업데이트하여 이러한 이벤트를 바인딩하고 처리할 수 있습니다.
비고
C++/WinRT VSIX(Visual Studio 확장) 및 NuGet 패키지(프로젝트 템플릿 및 빌드 지원을 함께 제공)를 설치하고 사용하는 방법에 대한 자세한 내용은 C++/WinRT대한
BookstoreViewModel 에 BookSkus 컬렉션 추가
C++/WinRT 속성에 바인딩하려면
BookstoreViewModel.idl
에 새 속성을 선언합니다.
// BookstoreViewModel.idl
...
runtimeclass BookstoreViewModel
{
BookSku BookSku{ get; };
Windows.Foundation.Collections.IObservableVector<BookSku> BookSkus{ get; };
}
...
중요합니다
C++/WinRT를 사용하여 컬렉션에 바인딩하는 것은 C#보다 약간 더 미묘합니다. 위의 MIDL 3.0 목록에서 BookSkus 속성의 형식은 IObservableVector 유형의 BookSku입니다. 다음 섹션에서는 이 주제의 ListBox 항목 소스를 BookSkus에 바인딩할 것입니다. 목록 상자는 항목 컨트롤이며 itemsControl.ItemsSource {x:Bind}
E_INVALIDARG 생성되고 {Binding}
자동으로 실패합니다.
경고
이 항목에 표시된 코드는 C++/WinRT 버전 2.0.190530.8 이상에 적용됩니다. 이전 버전을 사용하는 경우 표시된 코드를 약간 조정해야 합니다. 위의 MIDL 3.0 목록에서 BookSkus 속성을 IObservableVector의 IInspectable로 변경합니다. 그런 다음 구현에서 BookSku대신 IInspectable을 사용합니다.
저장하고 빌드합니다.
BookstoreViewModel.h
및 BookstoreViewModel.cpp
접근자 스텁을 \Bookstore\Bookstore\Generated Files\sources
폴더에 복사하세요 (자세한 내용은 XAML 컨트롤에 대한 이전 항목 , C++/WinRT 속성바인딩을 참조하세요). 이렇게 액세서 스텁을 구현합니다.
// 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 속성에 ListBox 바인딩
MainPage.xaml
을 열어 기본 UI 페이지에 대한 XAML 마크업을 확인하세요. 동일한 StackPanel 내에 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>
MainPage.cpp
에 Click 이벤트 처리기에 코드 한 줄을 추가하여 컬렉션에 책을 첨부합니다.
// 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"));
}
...
이제 프로젝트를 빌드하고 실행합니다. 버튼을 클릭하여 Click 이벤트 처리기를 실행합니다. Append를 구현하면 컬렉션이 변경되었음을 UI에 알리기 위해 이벤트가 발생합니다. 그리고 ListBox는 컬렉션을 다시 쿼리하여 Items 값을 업데이트합니다. 이전과 마찬가지로, 책 중 하나의 제목이 변경; 단추와 목록 상자에 제목 변경 내용이 모두 반영됩니다.
중요 API
관련 항목
- C++/WinRT를 사용하여 API 활용하기
- C++/WinRT 사용하여 작성자 API