다음을 통해 공유


XAML 항목 컨트롤; C++/WinRT 컬렉션에 바인딩

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대한 Visual Studio 지원을 참조하세요.

BookstoreViewModel 에 BookSkus 컬렉션 추가

C++/WinRT 속성에 바인딩하려면 XAML 컨트롤에서, 우리는 기본 보기 모델에 BookSku 형식의 속성 을 추가했습니다. 이 단계에서는 winrt::single_threaded_observable_vector 팩터리 함수 템플릿을 사용하여 동일한 보기 모델에서 관찰 가능한 BookSku 컬렉션을 구현하는 데 도움을 줍니다.

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 속성을 올바르게 설정하려면 IObservableVector또는 IVector형식 또는 IBindableObservableVector같은 상호 운용성 형식의 값으로 설정해야 합니다. 그렇지 않으면 {x:Bind}E_INVALIDARG 생성되고 {Binding} 자동으로 실패합니다.

경고

이 항목에 표시된 코드는 C++/WinRT 버전 2.0.190530.8 이상에 적용됩니다. 이전 버전을 사용하는 경우 표시된 코드를 약간 조정해야 합니다. 위의 MIDL 3.0 목록에서 BookSkus 속성을 IObservableVectorIInspectable로 변경합니다. 그런 다음 구현에서 BookSku대신 IInspectable을 사용합니다.

저장하고 빌드합니다. BookstoreViewModel.hBookstoreViewModel.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.cppClick 이벤트 처리기에 코드 한 줄을 추가하여 컬렉션에 책을 첨부합니다.

// 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