내용으로 건너뛰기
XamDockManager 요소의 ItemsSource

XamDockManager 요소의 ItemsSource

많은 사람들이 TabGroupPane의 ItemsSource를 컬렉션에 바인딩하는 것에 대해 질문했습니다. 이것은 TabGroupPane 에서 지원되지 않으므로 이유를 설명하고 대체 접근 방식을 제공 할 것이라고 생각했습니다.

4분 읽기

많은 사람들이 TabGroupPane의 ItemsSource를 컬렉션에 바인딩하는 것에 대해 질문했습니다. 이것은 TabGroupPane 에서 지원되지 않으므로 이유를 설명하고 대체 접근 방식을 제공 할 것이라고 생각했습니다.

DocumentContentHost 또는 특정 SplitPane을 컬렉션에 바인딩하려는 경우 이 솔루션도 허용하므로 계속 읽어야 합니다.

TabGroupPane은 파생된 ItemsControl이며 TabGroupPane에 표시되는 ItemsSource 속성은 기본 ItemsControl 클래스의 속성입니다. ItemsControl은 실제로 ItemsSource의 항목에 대해 만들어진 모든 컨테이너가 해당 ItemsControl 내에서 호스팅되도록 설계되었으며, 특히 ItemsPanel 속성으로 표시된 패널에 의해 호스팅됩니다. 따라서 항목이 컬렉션에 추가될 때 항목이 ItemsPanel의 자식으로 자동으로 푸시되거나 VirtualizingPanel의 경우 패널이 컨테이너가 하이드레이션되는 시기/를 제어할 수 있습니다. 또한 ItemsSource를 설정한 후에는 해당 Items 컬렉션을 직접 변경할 수 없으며, 변경하면 ItemCollection에서 예외가 발생합니다.

TabGroupPane에 대해 생각하면 포함된 항목, 즉 Items 컬렉션을 조작할 수 있어야 합니다. 이것은 여러 가지 이유로 발생할 수 있습니다. 예를 들어 최종 사용자가 창을 고정/고정 해제하거나, 패널을 그룹 안팎으로 드래그하거나, 하위 중 하나의 도킹/부동 상태를 변경하는 등의 경우가 있습니다. 컨트롤의 항목이 ItemsSource에 의해 제공된 경우에는 이러한 작업이 불가능하므로(Items 컬렉션은 수정할 수 없으므로) 컨트롤은 ItemsSource를 통한 Items 컬렉션 바인딩을 지원할 수 없습니다.

그렇다면 ItemsSource 속성을 사용하지 않고이를 어떻게 지원할 수 있습니까? 생각해보면 우리에게 필요한 것은 ItemContainerGenerator와 유사한 것입니다. ItemsControl 및 관련 ItemsPanel에서 원하는 형식이 아닌 항목에 대한 컨테이너/요소를 생성하는 데 사용하는 클래스입니다. 따라서 ListBox의 경우 해당 유형이 아닌 항목에 대해 ListBoxItem 인스턴스가 생성됩니다. 불행히도 ItemContainerGenerator 는 공개적으로 만들 수 없습니다.

그래서 필자가 취하기로 결정한 접근법은 소스 콜렉션을 제공 할 수있는 ContainerFactoryBase 라는 ItemContainerGenerator 타입 클래스를 만드는 것이었고 관련 컨테이너 콜렉션을 유지 관리했습니다. 컬렉션의 내용을 기반으로 컬렉션에서 변경 알림을 발생시킬 때 파생 클래스가 적절한 컨테이너(예: IsItemItsOwnContainer 및 GetContainerForItem)를 만들고 해당 컨테이너를 항목(예: ApplyItemContainerStyle 및 PrepareContainerForItem)과 연결하는 데 사용할 수 있는 ItemsControl과 유사한 메서드를 자체적으로 호출합니다. 소스 컬렉션의 항목이 추가/제거/이동될 때 메서드를 호출하여 파생 클래스가 연결된 컨테이너에 대해 적절한 작업을 수행할 수 있도록 합니다.

그런 다음 ContentPane 인스턴스를 각 항목의 컨테이너로 만들고 연결된 대상에 추가하는 ContentPaneFactory라는 파생 클래스를 만들었습니다. 이 클래스는 ContentPane의 속성을 Header, Content 및 TabHeader 속성을 포함한 데이터 항목의 속성에 바인딩하는 데 사용할 수 있는 여러 경로 속성을 노출합니다. 다른 속성의 경우 ContainerStyle 속성을 사용하여 ContentPane에 Style을 제공하거나 ItemBindings 컬렉션을 사용할 수 있습니다. 마지막으로, ContentPane이 생성될 때 연결된 이벤트(InitializeContentPane)를 발생시켜 필요한 프로그래밍 방식 초기화를 수행할 수 있도록 합니다.

이것을 더 쉽게 사용하기 위해 팩토리를 주어진 대상과 연결하는 데 사용되는 연결된 속성을 만들었습니다. 따라서 ContentPaneFactory.PaneFactory 속성을 TabGroupPane, SplitPane 또는 DocumentContentHost의 ContentPaneFactory 인스턴스로 설정하면 새 ContentPane 인스턴스가 추가되는 대상 요소가 됩니다.

    <igDock:DocumentContentHost >
        <igExtensions:ContentPaneFactory.PaneFactory>
            <!-- Binds to the Documents property of the DataContext. -->
            <igExtensions:ContentPaneFactory 
               ItemsSource="{Binding Documents}"
               HeaderPath="Name"
               ContentPath="." />
        </igExtensions:ContentPaneFactory.PaneFactory>
    </igDock:DocumentContentHost>

여기에서 샘플을 얻을 수 있습니다.

데모 요청